美文网首页elasticsearchjava
ES查询操作之高亮多个字段

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

作者: rainbowz | 来源:发表于2021-12-13 16:27 被阅读0次

请求突出显示
可以通过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: 权威指南

相关文章

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

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

  • ThinkPHP(四)

    连贯操作之ORDER排序 order多个条件用逗号隔开 连贯操作之field方法 field规定要查询的字段 连贯...

  • day59-flask模型关联及图片上传

    1与或非组合查询 flask中查询可以组合查询filter(模型名.字段=值)可以接多个filter表示且操作;也...

  • mysql2——11-21

    mysql2 mysql查询 查询整个表 从表查精确查询字段 精确查询多个字段AND为必传字段,key和value...

  • 数据查询

    ES查询用例 单个index 1、全文检索 多字段查询 2、地图搜索 地图字段查询,依赖数据中包含带有geo_lo...

  • 分组筛选的异同

    语法 特点: GROUP BY后跟分组函数查询的字段 分组可以按单个字段也可以多个字段 案例 分组前查询 查询班级...

  • Django model select 各种查询

    基本操作 常用操作 进阶操作 时间字段 Q 的使用 Q对象可以对关键字参数进行封装,从而更好的应用多个查询,可以组...

  • Elasticsearch Search API

    在ES中,text类型的字段,保存时会分词,查询时也会分词后进行查询。而keyword类型字段保存和查询时都不会分...

  • MySQL——连接查询(特殊的多表查询)

    连接查询(将具有管理关系的多个表连接起来进行查询操作) 1. 内连接语法格式:· SELECT 字段名列表 FRO...

  • MYSQL——DQL查询语言

    DQL查询语句 语法 基础查询 查询单个字段 查询多个字段 去掉重复 注意去除重复的需要结果集完全相同才能进行去除...

网友评论

    本文标题:ES查询操作之高亮多个字段

    本文链接:https://www.haomeiwen.com/subject/jvnjfrtx.html