目錄
一、基于 JavaRestClient 查詢文檔
1.1、查詢 API 演示
1.1.1、查詢基本框架
DSL 請(qǐng)求的對(duì)應(yīng)格式
響應(yīng)的解析
1.1.2、全文檢索查詢
1.1.3、精確查詢
1.1.4、復(fù)合查詢
1.1.5、排序和分頁(yè)
1.1.6、高亮
一、基于 JavaRestClient 查詢文檔
1.1、查詢 API 演示
1.1.1、查詢基本框架
接下里通過(guò)一個(gè) match_all 查詢所有,來(lái)演示以下基本的 API.
@Test
public void testMatchAll() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.matchAllQuery());
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
/**
* 處理響應(yīng)
* @param response
*/
private void handlerResponse(SearchResponse response) {
//1.解析結(jié)果
SearchHits hits = response.getHits();
//獲取總條數(shù)
long total = hits.getTotalHits().value;
SearchHit[] hits1 = hits.getHits();
for(SearchHit searchHit : hits1) {
//獲取source
String json = searchHit.getSourceAsString();
System.out.println(json);
}
}
由上可以看出查詢的基本步驟如下:
- 創(chuàng)建 SeaechRequest 對(duì)象,指定索引庫(kù).
- Request.source() 準(zhǔn)備參數(shù),也就是 DSL.
- 通過(guò) QueryBuilders 構(gòu)建查詢條件.
- 傳入?Request.source() 的 query() 方法,構(gòu)建好完整的查詢.
- 發(fā)送請(qǐng)求,得到結(jié)果.
- 解析結(jié)果(又外而內(nèi),逐層解析).
DSL 請(qǐng)求的對(duì)應(yīng)格式
DSL 語(yǔ)句的構(gòu)建是通過(guò) HighLevelRestClient 中的 Resource 實(shí)現(xiàn)的,其中包含了 查詢、排序】分頁(yè)、高亮等所有功能.
其中? query 表示查詢的意思,他的查詢條件的是由 QueryBuilders 的工具類提供的,包含了各種查詢方法.
響應(yīng)的解析
響應(yīng)解析這里,可以在 Kibana 上通過(guò)查詢結(jié)果,對(duì)比著看出 API 的調(diào)用關(guān)系.
1.1.2、全文檢索查詢
全文檢索的 match 和 multi_match 查詢和前面演示的 match_all 調(diào)用的?API 基本一致,差別就是查詢條件,也就是 query 部分(通過(guò) QueryBuilders 構(gòu)建的條件不一樣).
@Test
public void testMatch() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.matchQuery("brand", "如家"));
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
multi_match 也是如此,只是可以支持多個(gè)參數(shù)查詢.
@Test
public void testMultiMatch() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.multiMatchQuery("如家", "brand", "name"));
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
運(yùn)行結(jié)果:
1.1.3、精確查詢
精確查詢常見的有 term 查詢 和 range 查詢,同樣利用 QueryBuilders 實(shí)現(xiàn).
@Test
public void testTerm() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.termQuery("city", "上海"));
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
range 查詢也是如此.
@Test
public void testRange() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200)); //鏈?zhǔn)秸{(diào)用
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
1.1.4、復(fù)合查詢
布爾查詢是一個(gè)或多個(gè)查詢子句的組合. 子查詢的組合方式有:
- must:必須匹配的查詢條件,類似 “與”.
- should:選擇性匹配的查詢條件,類似 “或”.
- must_not:必須不匹配,不參與算分,類似 “非”.
- filter:必須匹配,不參與算分
RestAPI 中也提供 BoolQueryBuilder 條件構(gòu)建方法,用來(lái)添加上述條件.
@Test
public void testBoolQuery() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
BoolQueryBuilder booleanQuery = QueryBuilders.boolQuery();
booleanQuery.must(QueryBuilders.termQuery("city", "上海"));
booleanQuery.filter(QueryBuilders.rangeQuery("price").lte("200"));
request.source().query(booleanQuery); //鏈?zhǔn)秸{(diào)用
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
1.1.5、排序和分頁(yè)
對(duì)于搜索結(jié)果的排序和分頁(yè)與? query 是同級(jí)參數(shù),對(duì)應(yīng) API 如下.
@Test
public void testFromSize() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.matchAllQuery());
//分頁(yè) offset=20 size=10
request.source().from(20).size(10);
//降序排序
request.source().sort("price", SortOrder.DESC);
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
1.1.6、高亮
高亮的? API 包括請(qǐng)求構(gòu)建 DSL 語(yǔ)句 和 結(jié)果解析 兩個(gè)部分.
請(qǐng)求構(gòu)建如下:
@Test
public void testHighLighter() throws IOException {
//1.準(zhǔn)備 SearchRequest
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備參數(shù)
request.source().query(QueryBuilders.matchQuery("brand", "如家"));
request.source().highlighter(new HighlightBuilder()
.field("name")
.requireFieldMatch(false));
//3.發(fā)送請(qǐng)求,并接收響應(yīng)
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handlerResponse(response);
}
響應(yīng)解析如下 :
private void handlerResponse(SearchResponse response) throws JsonProcessingException {
//1.解析結(jié)果
SearchHits hits = response.getHits();
//獲取總條數(shù)
long total = hits.getTotalHits().value;
SearchHit[] hits1 = hits.getHits();
for(SearchHit searchHit : hits1) {
//獲取source
String json = searchHit.getSourceAsString();
System.out.println(json);
//2.處理高亮
//獲取高亮
Map<String, HighlightField> highlightFieldMap = searchHit.getHighlightFields();
if(!CollectionUtils.isEmpty(highlightFieldMap)) {
//獲取高亮字段的 value
HighlightField highlightField = highlightFieldMap.get("name");
if(highlightField != null) {
//取出高亮結(jié)果數(shù)組中的第一個(gè),這里是酒店名稱
String name = highlightField.getFragments()[0].string();
//對(duì)高亮字段的處理(這里打印做演示)
System.out.println(name);
}
}
}
}
運(yùn)行后可以看到通過(guò) sout 打印出的“高亮”字段(最后會(huì)傳輸給前端 ,讓前端處理高亮. 后端只是標(biāo)記出了哪些字段需要高亮處理)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-730261.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-730261.html
到了這里,關(guān)于ElasticSearch - 基于 JavaRestClient 查詢文檔(match、精確、復(fù)合查詢,以及排序、分頁(yè)、高亮)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!