Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(四)查询、排序、分页、高亮
基础代码
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);}}