elasticsearch7.0.1-highlighter高亮检索详解

highlighter高亮检索详解

参考官网https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html#highlighting-settings

什么是highlight

Highlight您能够从搜索结果中的一个或多个字段中获取突出显示的片段,以便您可以向用户显示查询匹配的位置。当您请求突出显示时,响应包含highlight 每个搜索命中的附加元素,其中包括突出显示的字段和突出显示的片段。

在提取要突出显示的术语时,highlight不会反映查询的布尔逻辑。因此,对于一些复杂的布尔查询(例如,嵌套的布尔查询,使用的查询minimum_should_match等),可以突出显示与查询匹配不对应的文档的部分。

突出显示需要字段的实际内容。如果未存储该字段(映射未设置store为true),_source则加载实际值并从中提取相关字段_source。

例如,要content使用默认突出显示器获取每个搜索命中中的字段的突出显示,请highlight在请求正文中包含指定content字段的对象:

 

GET /my_index/_search {{ "query" : {"query" : { "match": { "content": "kimchy" }"match": { "content": "kimchy" } },},

    "highlight" : {

        "fields" : {

            "content" : {}

        }

    }

}

Elasticsearch支持三种highlight,默认unified:

unified,plain和fvh(fast vector highlighter)。您可以指定type要为每个字段使用的突出显示器。

Unified highlighter

unified highlighter使用Lucene的统一highlighter。这个突出显示器将文本分成句子,并使用BM25算法对单个句子进行评分,就好像它们是语料库中的文档一样。它还支持准确的短语和多项(模糊,前缀,正则表达式)突出显示。这是默认的highlighter

elasticsearch7.0.1-highlighter高亮检索详解

Plain highlighter

plain highlighter使用标准Lucene的highlighter。它试图在词语重要性和短语查询中的任何单词定位标准方面反映查询匹配逻辑

plain highlighter最适合在单一领域突出简单的查询匹配。为了准确反映查询逻辑,它会创建一个微小的内存索引,并通过Lucene的查询执行计划程序重新运行原始查询条件,以访问当前文档的低级匹配信息。对于需要突出显示的每个字段和每个文档都会重复此操作。如果要在复杂查询的大量文档中突出显示很多字段,我们建议使用unified highlighter postings或term_vector字段elasticsearch7.0.1-highlighter高亮检索详解vector highlighter

fvh highlighter使用Lucene的Fast Vector highlighter。此突出显示器可用于映射中term_vector设置为的 字段with_positions_offsets。Fast Vector highlighter

PUT my_index

{

  "mappings": {

    "properties": {

      "content": {

        "type":  "text",

        "analyzer": "ik_max_word",

        "term_vector": "with_positions_offsets"

      },

      "ip_addr": {

        "type":  "keyword"

      }

    }

  }

}

elasticsearch7.0.1-highlighter高亮检索详解

highlighter 设置

常用参数详解

fragment_size

突出显示的片段的大小(以字符为单位)默认为100

fragment_offset

控制要开始突出显示的边距。仅在使用 fvh 有效

no_match_size

如果没有要突出显示的匹配片段,则要从字段开头返回的文本量。默认为0(不返回任何内容)

number_of_fragments

要返回的最大片段数。如果片段数设置为0,则不返回任何片段。而是突出显示并返回整个字段内容。当您需要突出显示标题或地址等短文本时,这可能很方便,但不需要分段。如果number_of_fragments 为0,fragment_size则忽略。默认为5

pre_tags

与结合使用post_tags来定义用于突出显示文本的HTML标记。默认情况下,高亮文本被包裹在<em>和</em>标签。指定为字符串数组

post_tags

与结合使用pre_tags来定义用于突出显示文本的HTML标记。默认情况下,高亮文本被包裹在<em>和</em>标签。指定为字符串数组

全局设置

您可以全局指定突出显示设置,如果字段存在同样设置则被覆盖

GET /my_index/_search

{

  "query" : {

    "match": {

      "content": "采购商纷至沓来"

    }

  },

  "highlight" : {

      "number_of_fragments" : 3,

      "fragment_size" : 150,

      "fields" : {

          "content" : {"type": "fvh"}

      }

  }

}

elasticsearch7.0.1-highlighter高亮检索详解

 

指定属性突出显示

GET /my_index/_search

{

  "query" : {

    "match": {

      "content": "采购商纷至沓来"

    }

  },

  "highlight" : {

      "number_of_fragments" : 3,

      "fragment_size" : 150,

      "fields" : {

        "content" : {

        "type": "fvh",

        "number_of_fragments" : 3,

        "fragment_size" : 150

        }

      }

  }

}

elasticsearch7.0.1-highlighter高亮检索详解

自定义高亮标签

GET /my_index/_search

{

  "query" : {

    "match": {

      "content": "采购商纷至沓来"

    }

  },

  "highlight" : {

      "number_of_fragments" : 3,

      "fragment_size" : 150,

      "pre_tags" : ["<tag1>"],

      "post_tags" : ["</tag1>"],

      "fields" : {

        "content" : {

          "pre_tags" : ["<tag2>"],

          "post_tags" : ["</tag2>"],

          "type": "fvh",

          "number_of_fragments" : 3,

          "fragment_size" : 150

        }

      }

  }

}

elasticsearch7.0.1-highlighter高亮检索详解

使用内置styled标记

GET /my_index/_search

{

  "query" : {

    "match": {

      "content": "采购商纷至沓来"

    }

  },

  "highlight" : {

      "tags_schema" : "styled",

      "fields" : {

        "content" : {

        }

      }

  }

}

elasticsearch7.0.1-highlighter高亮检索详解