ElasticSearch对文档的搜索
提示:以下是本篇文章正文内容,下面案例可供参考
一、文档的各种搜索
首先要注入RestHighlevelClient
在启动类中定义RestHighLevelClient的Bean
@Bean
public RestHighLevelClient client(){
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(
//填入自己的IP地址
HttpHost.create("http://192.168.***.***:9200")
));
return restHighLevelClient;
};
1.单字段以及多字段查询
@Test
void testMatchAll() throws IOException {
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
//查询全部
/* req.source().query(QueryBuilders.matchAllQuery());
req.source().query(QueryBuilders.matchQuery("all","如家"));*/
//单字段拆线呢
req.source().query(QueryBuilders.matchQuery("name","如家"));
//多字段查询
req.source().query(QueryBuilders.multiMatchQuery("如家","name","brand"));
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
handleResponse(search);
System.out.println(search);
}
2.Term精确查询
@Test
void testTerm() throws IOException {
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
req.source().query(QueryBuilders.termQuery("city", "北京"));
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
handleResponse(search);
System.out.println(search);
}
3.Range范围查询
@Test
void rangeTerm() throws IOException {
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
req.source().query(QueryBuilders.rangeQuery("price").gt(100).lt(400));
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
handleResponse(search);
System.out.println(search);
}
4.Boolean Query 范围查询
@Test
void booleanQuery() throws IOException {
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("city","上海"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").lte(300));
req.source().query(boolQueryBuilder);
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
handleResponse(search);
System.out.println(search);
}
5.分页/排序
@Test
void testPageAndSort() throws IOException {
int page = 1;
int size = 5;
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
req.source().query(QueryBuilders.matchAllQuery());
req.source().from((page-1)*size).size(size);
req.source().sort("price", SortOrder.ASC);
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
handleResponse(search);
System.out.println(search);
}
6.高亮显示
@Test
void testHighLight() throws IOException {
//准备请求
SearchRequest req = new SearchRequest("hotel");
//准备DSL
req.source().query(QueryBuilders.matchQuery("all","如家"));
req.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
highLight(search);
System.out.println(search);
}
7.Term 聚合
聚合函数,下面是根据品牌进行聚合,每个品牌有哪些
@Test
//Term聚合
void testAggregation() throws IOException {
//1.准备请求
SearchRequest req = new SearchRequest("hotel");
//2.准备DSL
//2.1设置size
req.source().size(0);
//2.2设置聚合
req.source().aggregation(AggregationBuilders.terms("BrandAgg")
.field("brand")
.size(20)
);
//发送请求
SearchResponse search = client.search(req, RequestOptions.DEFAULT);
//解析search
aggregationResponse(search);
System.out.println(search);
}
8.自动补全
//自动补全
@Test
void testSuggest() throws IOException {
//1.准备Request
SearchRequest request = new SearchRequest("hotel");
//2.准备DSL
request.source().suggest(new SuggestBuilder().addSuggestion(
"suggestions",
SuggestBuilders.completionSuggestion("suggestion")
.prefix("bj")
.skipDuplicates(true)
.size(10)
));
//3.发起请求
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
//4.解析结果
Suggest suggest = search.getSuggest();
CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");
for (CompletionSuggestion.Entry.Option option : suggestions.getOptions()) {
String text = option.getText().toString();
System.out.println(text);
}
}
二、文档的解析
1.解析普通search
代码如下(示例):
private static void handleResponse(SearchResponse search) {
SearchHits hits = search.getHits();
long value = hits.getTotalHits().value;
System.out.println("一共有:"+value+"数据");
SearchHit[] hits1 = hits.getHits();
for (SearchHit hit: hits1){
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
}
2.解析高亮
代码如下(示例):
//解析高亮
public static void highLight(SearchResponse search){
SearchHits hits = search.getHits();
long value = hits.getTotalHits().value;
System.out.println("一共有:"+value+"数据");
SearchHit[] hits1 = hits.getHits();
for (SearchHit hit: hits1){
String sourceAsString = hit.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
//获取高亮结果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField name = highlightFields.get("name");
String s = name.getFragments()[0].toString();
hotelDoc.setName(s);
System.out.println(hotelDoc);
}
}
3.解析term聚合
代码如下(示例):
//解析Terms聚合
public static void aggregationResponse(SearchResponse search) {
//获取aggregations
Aggregations aggregations = search.getAggregations();
//获取aggregation 注意是terms类型的
Terms brandAgg = aggregations.get("BrandAgg");
//获取buckets
List<? extends Terms.Bucket> buckets = brandAgg.getBuckets();
//获取key,遍历
for (Terms.Bucket bucket:buckets){
String keyAsString = bucket.getKeyAsString();
long docCount = bucket.getDocCount();
System.out.println("品牌: " +keyAsString+ " 数量: "+docCount);
}
}