elasticsearchjava

ES查询操作之高亮多个字段

2021-12-13  本文已影响0人  rainbowz

请求突出显示
可以通过HighlightBuilder.FieldHighlightBuilder来进行设置

高亮请求的高亮API如下:


高亮请求构建API
DSL语句
GET /hotel/_search
{
  "from": 0,
  "size": 3,
  "query": {
    "multi_match": {
      "query": "速8",
      "fields": [
        "brand^1.0",
        "name^1.0"
      ],
      "type": "best_fields",
      "operator": "AND",
      "slop": 0,
      "prefix_length": 0,
      "max_expansions": 50,
      "zero_terms_query": "NONE",
      "auto_generate_synonyms_phrase_query": true,
      "fuzzy_transpositions": true,
      "boost": 1
    }
  },
  "highlight": {
    "pre_tags": [
      "<span style=color:green>"
    ],
    "post_tags": [
      "</span>"
    ],
    "fields": {
      "brand": {},
      "name": {}
    }
  }
}
java代码如下
  /**
     * index :hotel
     *
     * @throws IOException
     */
    @Test
    public void testHighLights() throws IOException {

        SearchRequest searchRequest = new SearchRequest("hotel");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        MultiMatchQueryBuilder multiMatchQuery = QueryBuilders
                .multiMatchQuery("速8", "brand", "name")
                //默认是OR
                .operator(Operator.AND);
        HighlightBuilder highlightBuilder = new HighlightBuilder();


        HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("brand");
        highlightBuilder.field(highlightTitle);
        HighlightBuilder.Field highlightFilecontent = new HighlightBuilder.Field("name");
        highlightBuilder.field(highlightFilecontent);

        highlightBuilder
                .preTags("<span style=color:green>")
                .postTags("</span>");
        searchSourceBuilder.highlighter(highlightBuilder);
        searchSourceBuilder.query(multiMatchQuery);
        searchSourceBuilder.from((0));
        searchSourceBuilder.size(3);
        searchRequest.source(searchSourceBuilder);
        ArrayList<Map<String, Object>> resultList = new ArrayList<>();
        ArrayList<HotelDoc> hotelDocArrayList = new ArrayList<>();

        SearchResponse searchResponse = client
                .search(searchRequest, RequestOptions.DEFAULT);
        log.info("DSL语句为:{}", searchRequest.source().toString());
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();


        for (SearchHit hit : searchHits) {

            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String source = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(source, HotelDoc.class);

            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField hTitle = highlightFields.get("brand");

            if (hTitle != null) {
                String hBrandText = "";
                Text[] fragments = hTitle.fragments();
                for (Text text : fragments) {
                    hBrandText += text;
                }
                sourceAsMap.put("brand", hBrandText);
                hotelDoc.setBrand(hBrandText);
            }
            HighlightField hFilecontent = highlightFields.get("name");
            if (hFilecontent != null) {
                String hNametText = "";
                Text[] fragments = hFilecontent.fragments();
                for (Text text : fragments) {
                    hNametText += text;
                }
                sourceAsMap.put("name", hNametText);
                hotelDoc.setName(hNametText);
            }
            resultList.add(sourceAsMap);
            hotelDocArrayList.add(hotelDoc);
        }

        // resultList.stream().forEach(System.out::println);
        hotelDocArrayList.stream().forEach(System.out::println);

    }
查询返回结果
打印高亮结果
解析高亮结果

可以看到我们的高亮已经设置成功。

参考: Elasticsearch: 权威指南

上一篇 下一篇

猜你喜欢

热点阅读