ES基本操作
@Configuration public class ElasticSearchClientConfig { @Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("39.105.145.159",9200,"http")) ); return client; } }
注入RestHighLevelClient
@Autowired @Qualifier("restHighLevelClient") RestHighLevelClient client;
PUT index
void testIndex() { //1.创建索引的请求 CreateIndexRequest request = new CreateIndexRequest("test_index"); //2客户端执行请求,请求后获得响应 CreateIndexResponse response = null; try { response = client.indices().create(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(response); }
void testExistIndex() throws IOException { //1.创建索引的请求 GetIndexRequest request = new GetIndexRequest("test_index"); //2客户端执行请求,请求后获得响应 boolean exist = client.indices().exists(request, RequestOptions.DEFAULT); System.out.println("测试索引是否存在-----"+exist); }
void testDeleteIndex() throws IOException { DeleteIndexRequest request = new DeleteIndexRequest("test_index"); AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT); System.out.println("删除索引--------" + delete.isAcknowledged()); }
void testAddDocument() throws IOException { //创建对象 User user = new User("小明",18); //创建请求 IndexRequest request = new IndexRequest("test_index"); //制定规则 request.id("1");//id request.timeout(TimeValue.timeValueSeconds(1));//过期时间 //request.timeout("1s"); //将数据放入请求 request.source(JSON.toJSONString(user), XContentType.JSON); //客户端发送请求 IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); }
void testIsExists() throws IOException { GetRequest getRequest = new GetRequest("test_index", "1"); getRequest.fetchSourceContext(new FetchSourceContext(false));//不获取_source的上下文,效率更高 getRequest.storedFields("_none_"); boolean exists = client.exists(getRequest,RequestOptions.DEFAULT); System.out.println(exists); }
void testGetDocument() throws IOException{ GetRequest getRequest = new GetRequest("test_index", "1"); GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); System.out.println(getResponse.getSourceAsString());//打印文档内容 System.out.println(getResponse);//返回的全部内容和命令获取的是一样的 }
void testUpdateDocument() throws IOException{ UpdateRequest updateRequest = new UpdateRequest("test_index", "1"); updateRequest.timeout("1s"); User user = new User("小明", 10); updateRequest.doc(JSON.toJSONString(user),XContentType.JSON); UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(update.status()); System.out.println(update); }
void testDeleteDocument() throws IOException{ DeleteRequest deleteRequest = new DeleteRequest("test_index", "1"); deleteRequest.timeout("1s"); DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(delete); System.out.println(delete.status()); }
void testBulkDocument() throws IOException { BulkRequest bulkRequest = new BulkRequest(); bulkRequest.timeout("10s");//数据越大时间越多 ArrayList<User> arrayList = new ArrayList<>(); arrayList.add(new User("小明",10)); arrayList.add(new User("小红",11)); arrayList.add(new User("小1",12)); arrayList.add(new User("小2",13)); arrayList.add(new User("小3",14)); arrayList.add(new User("小4",15)); //批处理请求 for(int i = 0;i<arrayList.size();i++){ bulkRequest.add( new IndexRequest("test_index") .id(""+(i+1)) .source(JSON.toJSONString(arrayList.get(i)),XContentType.JSON) ); } BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(bulk.hasFailures());//是否失败 false:成功 true:失败 }
void testSearch() throws IOException { ArrayList<Map<String,Object>> list = new ArrayList<>(); SearchRequest searchRequest = new SearchRequest("test_index"); //构建搜索条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //查询条件,可以使用QueryBuilders 因为中文愿意查不出中文,所以将name改为name.keyword,也可以安装ik分词器 TermQueryBuilder termQuery = QueryBuilders.termQuery("name.keyword", "小红");//精确查询 sourceBuilder.query(termQuery); //匹配所有 /*MatchAllQueryBuilder allQueryBuilder = QueryBuilders.matchAllQuery(); sourceBuilder.query(allQueryBuilder);*/ //在60s内查询出来 sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //分页 sourceBuilder.from(0); sourceBuilder.size(4); //高亮显示 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("name.keyword"); highlightBuilder.requireFieldMatch(false); //多个单词高亮的话,要把这个设置为trues highlightBuilder.preTags("<span style='color:red'>"); highlightBuilder.postTags("</span>"); sourceBuilder.highlighter(highlightBuilder); //执行搜索 searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//执行请求 for (SearchHit hit : searchResponse.getHits().getHits()) { //解析高亮,用高亮替换原来的 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField name = highlightFields.get("name.keyword"); Map<String, Object> sourceAsMap = hit.getSourceAsMap();//原来的结果 if(name!=null){ Text[] fragments = name.fragments(); StringBuilder newName = new StringBuilder(); for (Text text : fragments) { newName.append(text); } sourceAsMap.put("name", newName.toString()); list.add(sourceAsMap); } } System.out.println(list.toString()); }
注入RestHighLevelClient
@Autowired @Qualifier("restHighLevelClient") RestHighLevelClient client;
搜索框架
void findByName() throws IOException { SearchRequest searchRequest = new SearchRequest("test_index"); //构建搜索条件 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //存储多个条件 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); //构建条件 TermQueryBuilder query1 = QueryBuilders.termQuery("name.keyword","小明"); //条件放入 queryBuilder.should(query1); //多条件引入 sourceBuilder.query(queryBuilder); //进行分页 sourceBuilder.from(0); sourceBuilder.size(6); //条件进入请求 searchRequest.source(sourceBuilder); //执行查询 SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); //解析查询结果 for (SearchHit hit : search.getHits().getHits()) { System.out.println(hit.getSourceAsMap().toString()); } }
TermQueryBuilder query1 = QueryBuilders.termQuery("name.keyword","小明");
根据名字查询,查询name,加上keyword是由于中文匹配,keyword不会进行分词,才能够进行查询,不加keyword默认是text,会进行分词
MatchQueryBuilder name = QueryBuilders.matchQuery("name", "小明");
查询结果:
它会将“小明”分为“小”与“明”进行查询,所以将“小兰”也查出来了
//构建条件QueryStringQueryBuilder name = new QueryStringQueryBuilder("小兰").field("name").defaultOperator(Operator.AND);
使用QueryStringQueryBuilder构造查询条件,不用keyword也可以精确查询。
WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "小"));
查询结果:
小字进行模糊查询。
RangeQueryBuilder age = QueryBuilders.rangeQuery("age").from(12, true).to(15, true);
后面的true表示包含当前值即:[12,15],若为false则为(12,15)。
//搜索条件WildcardQueryBuilder wildcardQuery1 = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "小"));WildcardQueryBuilder wildcardQuery2 = QueryBuilders.wildcardQuery("name.keyword", String.format("*%s*", "兰"));queryBuilder.must(wildcardQuery1).must(wildcardQuery2);
查询结果:
这里使用的是must进行合并查询,代表and,使用should即代表or,可以分开写也可以合在一条语句。
保存笔记,以后总能用得着。