文章目录
参考
- Highlighting
- 深入学习访问基础篇和高级篇
- 所有栏目内容参考栏目预告
高亮
- 高亮显示使您能够从搜索结果中的一个或多个字段中获得高亮显示的片段,这样您就可以向用户显示查询匹配的位置。当您请求高亮显示时,响应为每个搜索命中包含一个额外的高亮显示元素,该元素包括高亮显示的字段和高亮显示的片段。
-
高亮显示需要字段的实际内容。如果没有存储该字段(映射没有将store设置为true),则加载实际的_source并从_source中提取相关字段。
-
例如,要使用默认的高亮显示器在每次搜索命中的content字段中获得高亮显示,请在请求体中包含一个指定content字段的highlight对象:
GET /_search
{
"query": {
"match": { "content": "kimchy" }
},
"highlight": {
"fields": {
"content": {}
}
}
}
- Elasticsearch支持三种高亮显示器:unified、plain和fvh(快速矢量高亮显示)。您可以指定要为每个字段使用的高亮显示器类型。
unified高亮显示器
-
unified高亮显示器使用Lucene Unified Highlighter。这个高亮显示将文本分解成句子,并使用BM25算法对单个句子进行评分,就像它们是语料库中的文档一样。它还支持精确短语和多术语(模糊、前缀、正则表达式)高亮显示。这是默认的高亮显示器。
-
总结
- 作用范围
- 句子
- 短语
- 术语
- 是默认高亮显示器
- 作用范围
plain高亮显示器
- plain高亮显示器使用标准的Lucene highlighter。在短语查询中,它试图从理解词的重要性和任何词的定位标准两个方面反映查询匹配逻辑。
- 总结:
- 关注点
- 词的重要性及位置
- 匹配逻辑
- 适用于
- 简单查询
- 关注点
fvh高亮显示器
- fvh高亮显示器使用Lucene Fast Vector highlighter。这个高亮显示可以用于映射中term_vector设置为with_positions_offsets的字段。fvh:
- 可以使用boundary_scanner自定义
- 需要将term_vector设置为with_positions_offsets,这会增加索引的大小
- 可以将多个字段的匹配组合成一个结果。参考matched_fields
- 可以在不同的位置分配不同的权重,允许像术语之上的短语匹配排序时,在增强查询中短语匹配高亮高于术语匹配
- 总结
- 适用于
- term_vector - with_positions_offsets
- 灵活性
- 适用于
偏移策略
- 为了从被查询的术语中创建有意义的搜索片段,高亮显示需要知道原始文本中每个单词的开始和结束字符偏移量。这些偏移量可从以下途径获得:
- postings列表。如果index_options在映射中设置为offsets,unified高亮显示器将使用此信息来高亮显示文档,而不需要重新分析文本。它直接在postings上重新运行原始查询,并从索引中提取匹配的偏移量,将集合限制为高亮显示的文档。如果您有较大的字段,这是很重要的,因为它不需要重新分析高亮显示的文本。与使用term_vectors相比,它需要更少的磁盘空间。
- 词向量。如果在映射中将term_vector设置为with_positions_offsets来提供term_vector信息,那么unified高亮显示器会自动使用term_vector来突出显示该字段。它的速度非常快,特别是对于大字段(> 1MB)和突出显示多词查询(如前缀或通配符),因为它可以访问每个文档的词汇字典。fvh高亮显示器总是使用术语向量。
- 普通高亮显示。在没有其他选择的情况下,unified使用此模式。它在内存中创建一个微小的索引,并通过Lucene的查询执行计划器重新运行原始的查询条件,以访问当前文档的低级匹配信息。这对于需要高亮显示的每个字段和每个文档都是重复的。plain高亮显示器总是使用普通的高亮显示。
高亮配置
- 高亮显示设置可以在全局级别上设置,也可以在字段级别上重写。
- boundary_chars
- 字符串包含的边界字符。默认为.,!? \t\n
- boundary_max_scan
- 要扫描多远的边界字符。默认20
- boundary_scanner
- 指定如何分割高亮显示的片段:chars、sentence或word。仅对unified和fvh高亮显示器有效。unified的高亮显示器默认为sentence。fvh高亮显示器默认为chars。
- chars
- 使用boundary_chars指定的字符作为高亮显示边界。boundary_max_scan设置控制扫描边界字符的距离。仅对fvh高亮显示器有效。
- sentence
- 以句子边界产生高亮显示片段,这是由Java的BreakIterator确定的。您可以通过boundary_scaner_locale指定要使用的语言环境。
- word
- 以单词边界产生高亮显示片段,这是由Java的BreakIterator确定的。您可以通过boundary_scaner_locale指定要使用的语言环境。
- boundary_scanner_locale
- 控制用于搜索句子和单词边界的语言环境。该参数采用语言标记的形式,例如:“en - US”、“fr - FR”、“ja-JP”。更多信息可以在Locale Language Tag文档中找到。默认值是Locale.ROOT。
- encoder
- 指示代码段是HTML编码的:default(无编码)还是HTML (HTML-转义代码段文本,然后插入高亮标记)
- fields
- 指定要为其检索高亮显示的字段。您可以使用通配符来指定字段。例如,您可以指定comment_*来突出显示以comment_开头的所有文本和关键字字段。
- force_source
- 即使字段是单独存储的,也要根据source高亮显示。默认值为false。
- fragmenter
- 指定如何将文本分解为高亮显示片段:
simple
或span
。只对plain
高亮显示器有效。默认为span
。 simple
- 将文本分割成相同大小的片段。
span
- 将文本分割成相同大小的片段,但尽量避免在突出显示的术语之间分割文本。当你在查询短语时,这很有用。默认。
- 指定如何将文本分解为高亮显示片段:
- fragment_offset
- 控制要开始高亮显示的距。仅在使用
fvh
高亮显示器时有效。
- 控制要开始高亮显示的距。仅在使用
- fragment_size
- 以字符表示的高亮显示的片段的大小。默认为100。
- highlight_query
- 突出显示搜索查询以外的查询。如果您使用rescore查询,这是特别有用的,因为这些是没有考虑到高亮显示默认情况。
- matched_fields
- 合并多个字段的匹配以高亮显示单个字段。这对于以不同方式分析相同字符串的多字段来说是最直观的。所有的
matched_fields
必须将term_vector
设置为with_positions_offsets
,但只有匹配组合的字段才会被加载,因此只有该字段受益于将store
设置为yes
。仅对fvh
高亮显示有效。
- 合并多个字段的匹配以高亮显示单个字段。这对于以不同方式分析相同字符串的多字段来说是最直观的。所有的
- no_match_size
- 如果没有要高亮显示的匹配片段,则从字段开头返回的文本量。默认值为0(不返回任何内容)。
- number_of_fragments
- 返回的最大片段数。如果片段数设置为0,则不返回片段。相反,将突出显示并返回整个字段内容。当您需要突出显示标题或地址等简短文本时,这可能很方便,但碎片化不是必需的。如果
number_of_fragments
为0,则忽略fragment_size
。默认为5。
- 返回的最大片段数。如果片段数设置为0,则不返回片段。相反,将突出显示并返回整个字段内容。当您需要突出显示标题或地址等简短文本时,这可能很方便,但碎片化不是必需的。如果
- order
- 当设置为score时,按分数对高亮显示的片段进行排序。默认情况下,片段将按照它们在字段中出现的顺序输出(顺序:none)。将该选项设置为score将首先输出最相关的片段。每个高亮显示应用自己的逻辑来计算相关分数。有关不同的高亮器如何找到最佳片段的详细信息,请参阅文档How highlighters work internally。
- phrase_limit
- 控制文档中被考虑的匹配短语的数量。防止
fvh
高亮显示分析过多的短语和消耗过多的内存。使用matched_fields
时,会考虑每个匹配字段使用phrase_limit
短语。提高该限制会增加查询时间并消耗更多内存。只支持fvh
高亮。默认为256。
- 控制文档中被考虑的匹配短语的数量。防止
- pre_tags
- 与
post_tags
一起使用,定义用于突出显示文本的HTML标记。默认情况下,高亮显示的文本被包装在<em>
和</em>
标签中。指定为字符串数组。
- 与
- post_tags
- 与
pre_tags
一起使用,定义用于高亮显示文本的HTML标记。默认情况下,高亮显示的文本被包装在<em>
和</em>
标签中。指定为字符串数组。
- 与
- require_field_match
- 默认情况下,只高亮显示包含查询匹配的字段。将
require_field_match
设置为false
,以高亮显示所有字段。默认值为true
。
- 默认情况下,只高亮显示包含查询匹配的字段。将
- max_analyzed_offset
- 默认情况下,为高亮显示请求分析的最大字符数是由
index.highlight.max_analyzed_offset
中定义的值限定的,当字符数超过这个限制时,将返回一个错误。如果将此设置设置为非负值,高亮显示将在定义的最大限制处停止,并且不处理文本的其余部分,因此不高亮显示,也不返回错误。max_analyzed_offset
查询设置不覆盖index.highlight.max_analyzed_offset
,当它被设置为比查询设置低的值时生效。
- 默认情况下,为高亮显示请求分析的最大字符数是由
- tags_schema
- 设置为
styled
以使用内置的标记架构。styled
模式定义了以下pre_tags
,并将post_tags
定义为</em>
。
<em class="hlt1">, <em class="hlt2">, <em class="hlt3">, <em class="hlt4">, <em class="hlt5">, <em class="hlt6">, <em class="hlt7">, <em class="hlt8">, <em class="hlt9">, <em class="hlt10">
- 设置为
- type
- 要使用的高亮显示器类型:
unified
、plain
或fvh
。默认unified
。
- 要使用的高亮显示器类型:
高亮实例
覆盖全局配置
- 您可以全局指定高亮显示设置,并有选择地为单个字段覆盖它们。
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"number_of_fragments" : 3,
"fragment_size" : 150,
"fields" : {
"body" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] },
"blog.title" : { "number_of_fragments" : 0 },
"blog.author" : { "number_of_fragments" : 0 },
"blog.comment" : { "number_of_fragments" : 5, "order" : "score" }
}
}
}
指定高亮查询
- 在高亮显示时,可以指定
highlight_query
来考虑其他信息。例如,下面的查询包括highlight_query
中的搜索查询和再评分查询。如果没有highlight_query
,高亮显示将只考虑搜索查询。
GET /_search
{
"query": {
"match": {
"comment": {
"query": "foo bar"
}
}
},
"rescore": {
"window_size": 50,
"query": {
"rescore_query": {
"match_phrase": {
"comment": {
"query": "foo bar",
"slop": 1
}
}
},
"rescore_query_weight": 10
}
},
"_source": false,
"highlight": {
"order": "score",
"fields": {
"comment": {
"fragment_size": 150,
"number_of_fragments": 3,
"highlight_query": {
"bool": {
"must": {
"match": {
"comment": {
"query": "foo bar"
}
}
},
"should": {
"match_phrase": {
"comment": {
"query": "foo bar",
"slop": 1,
"boost": 10.0
}
}
},
"minimum_should_match": 0
}
}
}
}
}
}
设置高亮显示器类型
- 类型字段允许强制使用特定的高亮显示器类型。取值包括:
unified
、plain
和fvh
。下面是强制使用plain
高亮显示器的示例:
GET /_search
{
"query": {
"match": { "user.id": "kimchy" }
},
"highlight": {
"fields": {
"comment": { "type": "plain" }
}
}
}
配置高亮显示标签
- 默认情况下,高亮显示通过
<emp>
和</emp>
包装高亮显示文本。这可以通过设置pre_tags
和post_tags
来控制,例如:
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"pre_tags" : ["<tag1>"],
"post_tags" : ["</tag1>"],
"fields" : {
"body" : {}
}
}
}
- 当使用fvh高亮显示器时,您可以指定额外的标签,并按“重要性”排序。
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"body" : {}
}
}
}
- 你也可以使用内置的
styled
标签模式:
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"tags_schema" : "styled",
"fields" : {
"comment" : {}
}
}
}
source上的高亮
- 强制突出显示基于source的字段,即使字段是单独存储的。默认值为
false
。
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"fields" : {
"comment" : {"force_source" : true}
}
}
}
高亮显示所有字段
- 默认情况下,只突出显示包含查询匹配的字段。将
require_field_match
设置为false
,以突出显示所有字段。
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"require_field_match": false,
"fields": {
"body" : { "pre_tags" : ["<em>"], "post_tags" : ["</em>"] }
}
}
}
组合多字段匹配
- fvh高亮可以组合多个字段的匹配,以高亮显示单个字段。这对于以不同方式分析相同字符串的多字段来说是最直观的。所有
matched_fields
必须将term_vector
设置为with_positions_offsets
,但只有匹配组合的字段才会被加载,因此只有该字段将受益于将store
设置为yes
。 - 在下面的例子中,
comment
由english
分析器分析,comment.plain
由standard
分析器分析。
GET /_search
{
"query": {
"query_string": {
"query": "comment.plain:running scissors",
"fields": [ "comment" ]
}
},
"highlight": {
"order": "score",
"fields": {
"comment": {
"matched_fields": [ "comment", "comment.plain" ],
"type": "fvh"
}
}
}
}
- 以上都匹配了“run with scissors”和“running with scissors”,并会突出显示“running”和“scissors”,而不是“run”。如果这两个短语都出现在一个大的文档中,那么在片段列表中“running with scissors”会被排在“run with scissors”前面,因为在那个片段中有更多的匹配。
GET /_search
{
"query": {
"query_string": {
"query": "running scissors",
"fields": ["comment", "comment.plain^10"]
}
},
"highlight": {
"order": "score",
"fields": {
"comment": {
"matched_fields": ["comment", "comment.plain"],
"type" : "fvh"
}
}
}
}
- 以上
run
和running
以及scissors
都会高亮显示,但是running with scissors
排序会在run with scissors
前面,因为comment.plain
设置了更大的权重。
GET /_search
{
"query": {
"query_string": {
"query": "running scissors",
"fields": [ "comment", "comment.plain^10" ]
}
},
"highlight": {
"order": "score",
"fields": {
"comment": {
"matched_fields": [ "comment.plain" ],
"type": "fvh"
}
}
}
}
- 上面的查询不会高亮显示“run”或“scissor”,但是显示了在匹配的字段中不列出匹配的字段(comment)是可以的。
"highlight": {
"fields": {
"comment": {}
}
}
- 写为
"highlight": {
"fields": {
"comment": {
"matched_fields": ["comment"],
"type" : "fvh"
}
}
}
显式排序高亮字段
- Elasticsearch按发送的顺序突出显示字段,但根据JSON规范,对象是无序的。如果你需要明确的顺序在哪些字段高亮显示指定字段,可以作为一个数组发送:
GET /_search
{
"highlight": {
"fields": [
{ "title": {} },
{ "text": {} }
]
}
}
- Elasticsearch内置的高亮器都不关心字段高亮的顺序,但插件可能会关心。
控制高亮片段
- 每个高亮显示的字段可以控制高亮显示的片段的大小(默认为100),以及返回的片段的最大数量(默认为5)。例如:
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"fields" : {
"comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
}
}
}
- 在此之上,可以指定突出显示的片段需要按分数排序:
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"order" : "score",
"fields" : {
"comment" : {"fragment_size" : 150, "number_of_fragments" : 3}
}
}
}
- 如果
number_of_fragments
值设置为0,那么不会产生任何片段,而是返回字段的整个内容,当然,它会高亮显示。如果短文本(如文档标题或地址)需要高亮显示,但不需要分段显示,这就非常方便了。注意,在这种情况下,fragment_size
被忽略。
GET /_search
{
"query" : {
"match": { "user.id": "kimchy" }
},
"highlight" : {
"fields" : {
"body" : {},
"blog.title" : {"number_of_fragments" : 0}
}
}
}
- 当使用
fvh
时,可以使用fragment_offset
参数来控制开始高亮显示的边界。 - 在没有需要高亮显示的匹配片段的情况下,默认是不返回任何内容。相反,我们可以通过将
no_match_size
(默认0)设置为希望返回的文本的长度,从字段的开头返回一个文本片段。当它尝试在字边界上断行时,实际长度可能比指定的短或长。
GET /_search
{
"query": {
"match": { "user.id": "kimchy" }
},
"highlight": {
"fields": {
"comment": {
"fragment_size": 150,
"number_of_fragments": 3,
"no_match_size": 150
}
}
}
}
使用postings列表高亮显示
- 下面是一个在索引映射中设置comment字段以允许高亮显示postings的例子:
PUT /example
{
"mappings": {
"properties": {
"comment" : {
"type": "text",
"index_options" : "offsets"
}
}
}
}
- 下面是一个设置comment字段允许使用
term_vector
高亮显示的例子(这将导致索引变大):
PUT /example
{
"mappings": {
"properties": {
"comment" : {
"type": "text",
"term_vector" : "with_positions_offsets"
}
}
}
}
为plain高亮显示器指定片段
- 当使用
plain
高亮显示器时,你可以在simple
和span
片段之间进行选择:
GET my-index-000001/_search
{
"query": {
"match_phrase": { "message": "number 1" }
},
"highlight": {
"fields": {
"message": {
"type": "plain",
"fragment_size": 15,
"number_of_fragments": 3,
"fragmenter": "simple"
}
}
}
}
- 响应:
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6011951,
"hits": [
{
"_index": "my-index-000001",
"_type": "_doc",
"_id": "1",
"_score": 1.6011951,
"_source": {
"message": "some message with the number 1",
"context": "bar"
},
"highlight": {
"message": [
" with the <em>number</em>",
" <em>1</em>"
]
}
}
]
}
}
GET my-index-000001/_search
{
"query": {
"match_phrase": { "message": "number 1" }
},
"highlight": {
"fields": {
"message": {
"type": "plain",
"fragment_size": 15,
"number_of_fragments": 3,
"fragmenter": "span"
}
}
}
}
- 响应:
{
...
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.6011951,
"hits": [
{
"_index": "my-index-000001",
"_type": "_doc",
"_id": "1",
"_score": 1.6011951,
"_source": {
"message": "some message with the number 1",
"context": "bar"
},
"highlight": {
"message": [
" with the <em>number</em> <em>1</em>"
]
}
}
]
}
}
- 如果
number_of_fragments
选项设置为0,则使用NullFragmenter,它根本不会对文本进行分段。这对于突出显示文档或字段的整个内容非常有用。
高亮显示器内部是如何工作的
- 给定一个查询和一个文本(文档字段的内容),高亮显示的目标是为查询找到最佳的文本片段,并在找到的片段中高亮显示查询词。为此,高亮显示器需要解决几个问题:
- 如何将文本分解成片段?
- 如何在所有的片段中找到最好的片段?
- 如何高亮显示片段中的查询词?
如何将文本分解成片段?
- 相关设置:
fragment_size
,fragmenter
, 高亮显示器的type
,boundary_chars
,boundary_max_scan
,boundary_scanner
,boundary_scaner_locale
。 plain
高亮显示器首先使用给定的分析器分析文本,然后从它创建一个分词流。plain
高亮显示器使用一个非常简单的算法将分词流分解为片段。它循环遍历分词流中的项,每当当前项的end_offset
超过fragment_size
乘以创建的片段数量时,就会创建一个新的片段。使用span片段器可以进行更多的计算,以避免在高亮显示的术语之间分割文本。但总的来说,由于断行只通过fragment_size
完成,一些片段可能会很奇怪,例如以标点符号开头。通过使用Java的BreakIterator
,unified
或fvh
高亮器可以更好地将文本分解为多个片段。这确保只要fragment_size
允许,一个片段就是一个有效的句子。
如何找到最好的片段
- 相关配置:
number_of_fragments
; - 为了找到最好的、最相关的片段,高亮显示需要根据给定的查询为每个片段打分。目标是只对那些参与在文档上生成命中目标的术语进行评分。对于一些复杂的查询,这仍在进行中。
- 普通的高亮显示从当前的分词流创建一个内存中的索引,并通过Lucene的查询执行计划程序重新运行原始的查询条件,以获得对当前文本的低级匹配信息的访问。对于更复杂的查询,原始查询可以转换为
span
查询,因为span
查询可以更准确地处理短语。然后利用得到的低层次匹配信息对每个片段进行评分。plain
高亮显示器的评分方法非常简单。每个片段根据在该片段中发现的惟一查询词的数量进行评分。单个术语的得分等于其权重,默认值为1。因此,默认情况下,包含一个唯一查询词的片段将得到1分;而包含两个惟一查询词的片段将得到2分,以此类推。然后根据分数对片段进行排序,因此得分最高的片段将首先输出。 fvh
不需要分析文本并构建内存中索引,因为它使用了预先索引的文档术语向量,并在其中查找与查询对应的术语。fvh
根据在该片段中找到的查询词的数量对每个片段进行评分。与plain
高亮显示类似,单个术语的得分等于其权重。与plain
高亮显示相比,所有的查询词都被计数,而不仅仅是唯一的词。unified
高亮显示器可以使用预索引的术语向量或预索引的术语偏移量,如果他们是可用的。否则,类似于plain
高亮显示器,它必须从文本创建一个内存索引。unified
高亮显示器采用BM25评分模型对片段进行评分。
如何高亮显示片段中的查询词?
- 相关配置:
pre-tags
,post-tags
. - 目标是只在文档中高亮显示那些参与生成命中内容的术语。对于一些复杂的布尔查询,这仍在进行中,因为高亮显示不反映一个查询的布尔逻辑,只是提取叶(术语,短语,前缀等)查询。
plain
高亮显示器给出了分词流和原始文本,重新组合原始文本以仅高亮显示上一步中包含在低级匹配信息结构中的分词流中的术语。fvh
和unified
的高亮显示器使用中间数据结构来表示一些原始形式的片段,然后用实际的文本填充它们。- 高亮显示器使用
pre-tags
和post-tags
来编码高亮显示的术语。
一个unifed高亮显示器的工作实例
- 让我们更详细地看看unified高亮显示器是如何工作的。
- 首先,我们创建一个带有文本字段
content
的索引,该索引将使用english
分析器进行索引,索引将不使用偏移量或术语向量。
PUT test_index
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "english"
}
}
}
}
- 我们将以文档件放入索引中:
PUT test_index/_doc/doc1
{
"content" : "For you I'm only a fox like a hundred thousand other foxes. But if you tame me, we'll need each other. You'll be the only boy in the world for me. I'll be the only fox in the world for you."
}
- 然后我们用一个高亮的请求运行下面的查询:
GET test_index/_search
{
"query": {
"match_phrase" : {"content" : "only fox"}
},
"highlight": {
"type" : "unified",
"number_of_fragments" : 3,
"fields": {
"content": {}
}
}
}
- 在找到
doc1
作为该查询的命中值后,该命中值将被传递到unified
高亮显示器,以高亮显示文档的字段内容。由于字段内容既没有使用偏移量也没有使用词向量进行索引,它的原始字段值将被分析,并且内存中的索引将从匹配查询的term构建:
{"token":"onli","start_offset":12,"end_offset":16,"position":3},
{"token":"fox","start_offset":19,"end_offset":22,"position":5},
{"token":"fox","start_offset":53,"end_offset":58,"position":11},
{"token":"onli","start_offset":117,"end_offset":121,"position":24},
{"token":"onli","start_offset":159,"end_offset":163,"position":34},
{"token":"fox","start_offset":164,"end_offset":167,"position":35}
- 我们的复杂短语查询将被转换为
span
查询:spanNear([text:onli, text:fox], 0, true),这意味着我们正在寻找彼此之间距离为0的术语“onli”和“fox”,并且按照给定的顺序。span
查询将在之前在内存中创建的索引上运行,以找到以下匹配:
{"term":"onli", "start_offset":159, "end_offset":163},
{"term":"fox", "start_offset":164, "end_offset":167}
- 在我们的示例中,只有一个匹配项,但也可能有多个匹配项。给定这些匹配,统一的高亮将字段的文本分割成所谓的“段落”。每个段落必须包含至少一个匹配项。使用Java的
BreakIterator
的统一的高亮显示确保每个段落表示一个完整的句子,只要它不超过fragment_size
。在我们的例子中,我们有一个带有以下属性的单一段落(这里只显示了属性的一个子集):
Passage:
startOffset: 147
endOffset: 189
score: 3.7158387
matchStarts: [159, 164]
matchEnds: [163, 167]
numMatches: 2
- 请注意,一篇文章是如何使用适合文章的BM25评分公式计算得分的。如果可用的段落数超过用户
number_of_fragments
所要求的段落数,那么分数允许我们选择最佳得分段落。分数还可以让我们按顺序对文章进行排序:如果用户要求,可以使用“score”。 - 作为最后一步,统一的高亮将从字段的文本中提取对应于每个段落的字符串:
"I'll be the only fox in the world for you."
- 并使用标签和来格式化该字符串中的所有匹配,使用段落的
matchStarts
和matchEnds
信息:
I'll be the <em>only</em> <em>fox</em> in the world for you.
- 这种格式化字符串是高亮显示返回给用户的最终结果。