高亮显示
您可以使用搜索 API 的 highlight 参数从搜索结果的一个或多个字段中检索最佳匹配的高亮片段,以便向用户展示查询匹配的位置。当您请求高亮时,响应中会包含一个额外的 highlight 元素,其中包含高亮显示的字段和高亮片段,对应每个搜索命中项。有关最新的 API 详细信息,请参考搜索 API。
高亮显示器在提取要高亮的词条时,不会反映查询的布尔逻辑。因此,对于某些复杂的布尔查询(例如嵌套布尔查询、使用 minimum_should_match 等的查询),文档中的某些部分可能会被高亮显示,但它们并不对应实际的查询匹配项。
高亮显示需要字段的实际内容。如果该字段未存储(映射中未将 store 设置为 true),则会加载实际的 _source 并从中提取相关字段。
例如,要使用默认的高亮显示器获取每个搜索命中项中 content 字段的高亮显示,可以在请求体中包含一个 highlight 对象,并指定 content 字段
GET /_search
{
"query": {
"match": { "content": "kimchy" }
},
"highlight": {
"fields": {
"content": {}
}
}
}
Elasticsearch 针对 text 和 keyword 字段支持三种高亮显示器:unified、plain 和 fvh(快速向量高亮显示器),并针对 semantic_text 字段支持 semantic 高亮显示器。您可以为每个字段指定要使用的高亮显示器 type,或者依赖字段类型的默认高亮显示器。
unified 高亮显示器使用 Lucene 统一高亮显示器。该高亮显示器将文本拆分为句子,并使用 BM25 算法对各个句子进行评分,就像它们是语料库中的文档一样。它还支持精确的短语和多词条(模糊、前缀、正则表达式)高亮显示。unified 高亮显示器可以将来自多个字段的匹配项组合成一个结果(参见 matched_fields)。
这是所有 text 和 keyword 字段的默认高亮显示器。
semantic 高亮显示器专门设计用于 semantic_text 字段。它根据查询与每个片段之间的语义相似度,从字段中识别并提取最相关的片段。
默认情况下,semantic_text 字段使用语义高亮显示器。
plain 高亮显示器使用标准的 Lucene 高亮显示器。它试图在理解单词重要性以及短语查询中的任何单词定位标准方面反映查询匹配逻辑。
plain 高亮显示器最适合高亮显示单个字段中的简单查询匹配项。为了准确反映查询逻辑,它会创建一个微小的内存索引,并通过 Lucene 的查询执行计划器重新运行原始查询条件,以获取当前文档的底层匹配信息。对于每个需要高亮的字段和每个文档,都会重复此过程。如果您想在大量文档中使用复杂查询高亮显示大量字段,我们建议在 postings 或 term_vector 字段上使用 unified 高亮显示器。
fvh 高亮显示器使用 Lucene 快速向量高亮显示器。该高亮显示器可用于映射中将 term_vector 设置为 with_positions_offsets 的字段。快速向量高亮显示器
- 可以使用
boundary_scanner进行自定义。 - 需要将
term_vector设置为with_positions_offsets,这会增加索引的大小 - 可以将来自多个字段的匹配项组合到一个结果中。请参见
matched_fields - 可以为不同位置的匹配项分配不同的权重,从而支持诸如以下功能:在对提升短语匹配而非词条匹配的提升查询 (Boosting Query) 进行高亮显示时,短语匹配的排名字段会高于词条匹配
fvh 高亮显示器不支持跨度查询。如果您需要支持跨度查询,请尝试其他高亮显示器,例如 unified 高亮显示器。
为了从正在查询的词条中创建有意义的搜索片段,高亮显示器需要知道原始文本中每个单词的起始和结束字符偏移量。这些偏移量可以从以下来源获取:
- 倒排索引列表 (Postings list)。如果在映射中将
index_options设置为offsets,则unified高亮显示器会使用此信息在不重新分析文本的情况下高亮显示文档。它直接在倒排索引上重新运行原始查询,并从索引中提取匹配的偏移量,将收集范围限制为高亮显示的文档。如果您拥有大型字段,这一点非常重要,因为它不需要重新分析要高亮显示的文本。与使用term_vectors相比,它还需要更少的磁盘空间。 - 词条向量 (Term vectors)。如果通过在映射中将
term_vector设置为with_positions_offsets来提供term_vector信息,则unified高亮显示器会自动使用term_vector来高亮显示字段。它速度非常快,特别是对于大型字段(>1MB)以及高亮显示多词条查询(如prefix或wildcard),因为它能够访问每个文档的词条字典。fvh高亮显示器始终使用词条向量。 - 普通高亮显示 (Plain highlighting)。当没有其他替代方案时,
unified会使用此模式。它会创建一个微小的内存索引,并通过 Lucene 的查询执行计划器重新运行原始查询条件,以获取当前文档的底层匹配信息。对于每个需要高亮的字段和每个文档,都会重复此过程。plain高亮显示器始终使用普通高亮显示。
对于大型文本,普通高亮显示可能需要大量的时间和内存。为了防止这种情况,将要分析的最大文本字符数限制为 1000000。可以使用索引设置 index.highlight.max_analyzed_offset 为特定索引更改此默认限制。