-
- @BeforeEach
- void setUp() {
- this.client = new RestHighLevelClient(RestClient.builder(
- HttpHost.create("http://43.139.59.28:9200")
- ));
-
- }
-
- @AfterEach
- void tearDown() throws IOException {
- this.client.close();
- }
- @Test
- void testMatchAll() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- request.source()
- .query(QueryBuilders.matchAllQuery());
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
-
- // 4.解析响应
- handleResponse(response);
- }
- private void handleResponse(SearchResponse response) {
- // 4.解析响应
- SearchHits searchHits = response.getHits();
- // 4.1.获取总条数
- long total = searchHits.getTotalHits().value;
- System.out.println("共搜索到" + total + "条数据");
- // 4.2.文档数组
- SearchHit[] hits = searchHits.getHits();
- // 4.3.遍历
- for (SearchHit hit : hits) {
- // 获取文档source
- String json = hit.getSourceAsString();
- // 反序列化
- HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
- System.out.println("hotelDoc = " + hotelDoc);
- }
- }
结果

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分
- @Test
- void testMatch() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- request.source()
- .query(QueryBuilders.matchQuery("all", "百家"));
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果

- @Test
- void testMatch() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- request.source()
- .query(QueryBuilders.multiMatchQuery("百家", "name","business"));
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果
精确查询主要是两者:
term:词条精确匹配
range:范围查询
与之前的查询相比,差异同样在查询条件,其它都一样
- @Test
- void testTerm() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- request.source()
- .query(QueryBuilders.termQuery("city", "北京"));
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果

- @Test
- void testTerm() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- request.source()
- .query(QueryBuilders.rangeQuery("price").gte(100).lte(2000));
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果

布尔查询是用must、must_not、filter等方式组合其它查询
- @Test
- void testBool() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- // 2.1.准备BooleanQuery
- BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
- // 2.2.添加term
- boolQuery.must(QueryBuilders.termQuery("city", "上海"));
- // 2.3.添加range
- boolQuery.filter(QueryBuilders.rangeQuery("price").lte(2000));
-
- request.source().query(boolQuery);
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果

搜索结果的排序和分页是与query同级的参数,因此同样是使用request.source()来设置
- @Test
- void testPageAndSort() throws IOException {
- // 页码,每页大小
- int page = 1, size = 5;
-
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- // 2.1.query
- request.source().query(QueryBuilders.matchAllQuery());
- // 2.2.排序 sort
- request.source().sort("price", SortOrder.ASC);
- // 2.3.分页 from、size
- request.source().from((page - 1) * size).size(5);
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse(response);
-
- }
结果

高亮的代码与之前代码差异较大,有两点:
查询的DSL:其中除了查询条件,还需要添加高亮条件,同样是与query同级。
结果解析:结果除了要解析_source文档数据,还要解析高亮结果
- @Test
- void testHighlight() throws IOException {
- // 1.准备Request
- SearchRequest request = new SearchRequest("hotel");
- // 2.准备DSL
- // 2.1.query
- request.source().query(QueryBuilders.matchQuery("all", "如家"));
- // 2.2.高亮
- request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
- // 3.发送请求
- SearchResponse response = client.search(request, RequestOptions.DEFAULT);
- // 4.解析响应
- handleResponse1(response);
-
- }
-
- private void handleResponse1(SearchResponse response) {
- // 4.解析响应
- SearchHits searchHits = response.getHits();
- // 4.1.获取总条数
- long total = searchHits.getTotalHits().value;
- System.out.println("共搜索到" + total + "条数据");
- // 4.2.文档数组
- SearchHit[] hits = searchHits.getHits();
- // 4.3.遍历
- for (SearchHit hit : hits) {
- // 获取文档source
- String json = hit.getSourceAsString();
- // 反序列化
- HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
- // 获取高亮结果
- Map<String, HighlightField> highlightFields = hit.getHighlightFields();
- if (!CollectionUtils.isEmpty(highlightFields)) {
- // 根据字段名获取高亮结果
- HighlightField highlightField = highlightFields.get("name");
- if (highlightField != null) {
- // 获取高亮值
- String name = highlightField.getFragments()[0].string();
- // 覆盖非高亮结果
- hotelDoc.setName(name);
- }
- }
- System.out.println("hotelDoc = " + hotelDoc);
- }
- }
结果
