基礎代碼
package com.test.xulk;import com.alibaba.fastjson.JSON;
import com.test.xulk.es.esdoc.HotelDoc;
import com.test.xulk.es.service.IHotelService;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;import java.io.IOException;
import java.util.Map;/*** 高級查詢*/
@SpringBootTest
class HotelSearchTest {private RestHighLevelClient client;@Autowiredprivate IHotelService hotelService;// 快捷鍵 alt + inster 選擇第二個 SetUp方法// 初始化 client@BeforeEachvoid setUp() {// // HttpHost.create("http://127.0.0.1:9200") // 若果是集群就配置多個this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://127.0.0.1:9200")));}// 銷毀@AfterEachvoid tearDown() throws IOException {client.close();}}
match_all查詢
語法
代碼示例
// 文檔查詢@Testvoid testSearchMatchAll() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchAllQuery());SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;SearchHit[] hits = searchHits.getHits();System.out.println(" ----------------// " + total);for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);System.out.println(" ====================================== ");System.out.println(" *********************** " + JSON.toJSONString(hit));}}
match查詢
// match 單字段 / 多字段 查詢文檔@Testvoid testSearchMatch() throws IOException {SearchRequest request = new SearchRequest("hotel");
// request.source().query(QueryBuilders.matchQuery("all","如家"));request.source().query(QueryBuilders.multiMatchQuery("如家","name","business"));SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;SearchHit[] hits = searchHits.getHits();System.out.println(" ----------------// total " + total);for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);System.out.println(" ====================================== ");System.out.println(" *********************** " + JSON.toJSONString(hit));}}
精確查詢
// 精確查詢 term查詢和range查詢@Testvoid testSearchtermQuery() throws IOException {SearchRequest request = new SearchRequest("hotel");
// request.source().query(QueryBuilders.termQuery("city","北京")); // 精準查詢request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(200)); // 區經查詢SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;SearchHit[] hits = searchHits.getHits();System.out.println(" ----------------// total " + total);for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);System.out.println(" ====================================== ");System.out.println(" *********************** " + JSON.toJSONString(hit));}}
布爾查詢
// 布爾查詢@Testvoid testSearchBoolQuery() throws IOException {// 1.準備RequestSearchRequest request = new SearchRequest("hotel");// 2.準備DSL// 2.1.準備BooleanQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 2.2.添加termboolQuery.must(QueryBuilders.termQuery("city", "北京"));// 2.3.添加rangeboolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));request.source().query(boolQuery);SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;SearchHit[] hits = searchHits.getHits();System.out.println(" ----------------// total " + total);for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);System.out.println(" ====================================== ");System.out.println(" *********************** " + JSON.toJSONString(hit));}}
排序分頁
// 排序@Testvoid testSearchSort() throws IOException {// 1.準備RequestSearchRequest request = new SearchRequest("hotel");SearchSourceBuilder source = request.source();source.query(QueryBuilders.matchAllQuery());source.sort("price", SortOrder.DESC);SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;System.out.println(" ----------------// total " + total);for (SearchHit hit : searchHits.getHits()) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);}}
// 分頁@Testvoid testSearchLimit() throws IOException {// 頁碼,每頁大小int page = 1, size = 5;// 1.準備RequestSearchRequest request = new SearchRequest("hotel");// 2.準備DSL// 2.1.queryrequest.source().query(QueryBuilders.matchAllQuery());// 2.2.排序 sortrequest.source().sort("price", SortOrder.ASC);// 2.3.分頁 from、sizerequest.source().from((page - 1) * size).size(5);SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;System.out.println(" ----------------// total " + total);for (SearchHit hit : searchHits.getHits()) {String sourceAsString = hit.getSourceAsString();System.out.println(" --------------------------- " + sourceAsString);}}
高亮
?
// 高亮@Testvoid testHighlight() throws IOException {// 1.準備RequestSearchRequest request = new SearchRequest("hotel");// 2.準備DSLrequest.source().query(QueryBuilders.matchQuery("all","如家"));request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));SearchResponse search = client.search(request, RequestOptions.DEFAULT);SearchHits searchHits = search.getHits();long total = searchHits.getTotalHits().value;System.out.println(" ----------------// total " + total);for (SearchHit hit : searchHits.getHits()) {String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);Map<String, HighlightField> highlightFields = hit.getHighlightFields();if(!CollectionUtils.isEmpty(highlightFields)){HighlightField highlightedField = highlightFields.get("name");if(highlightedField != null){String name = highlightedField.getFragments()[0].string();hotelDoc.setName(name);}}System.out.println(" hotelDoc ===== : " + hotelDoc);}}