高亮显示
Solr 中的高亮显示允许将与用户查询匹配的文档片段包含在查询响应中。
这些片段包含在查询响应的特殊部分(highlighting
部分)中,并且客户端使用其中包含的格式化提示来确定如何向用户显示代码段。片段是文档字段的一部分,其中包含来自查询的匹配项,有时也称为“代码段”或“段落”。
高亮显示具有极高的可配置性,可能比 Solr 的任何其他部分都高。对于片段大小、格式化、排序、备份/备用行为以及更多难以分类的选项,都有许多参数。尽管如此,高亮显示非常易于使用。
用法
高亮显示要求您在 模式中定义一个 uniqueKey
。
常见高亮显示器参数
您需要设置 hl
和通常的 hl.fl
参数以启用返回高亮显示结果。下表记录了这些参数以及其他一些受支持的参数。请注意,许多高亮显示参数支持按字段覆盖,例如:f.title_txt.hl.snippets
。
hl
-
可选
默认值:
false
使用此参数启用或禁用高亮显示。如果您想使用高亮显示,必须将其设置为
true
。 hl.method
-
可选
默认值:
unified
要使用的突出显示实现/引擎。可接受的值为:
unified
、original
、fastVector
。请参阅下面的 选择高亮显示器 部分,以了解可用高亮显示器之间的更多差异。
hl.fl
-
可选
默认值:
df
的值指定要高亮显示的字段列表,以逗号或空格分隔。这些必须是“存储的”。可以使用通配符
*
(星号)来匹配字段 glob,例如text_*
,甚至*
,以在所有可以高亮显示的字段上高亮显示。使用*
时,请考虑添加hl.requireFieldMatch=true
。请注意,此处列出的字段应与要高亮显示的查询中引用的字段具有兼容的文本分析(在模式中定义)。可能需要修改
hl.q
和hl.qparser
和/或修改文本分析。以下示例使用 本地参数 语法和 扩展 DisMax (eDisMax) 查询解析器 在
hl.fl
中高亮显示字段&hl.fl=field1 field2&hl.q={!edismax qf=$hl.fl v=$q}&hl.qparser=lucene&hl.requireFieldMatch=true
默认值是
df
参数的值,而df
参数本身没有默认值。 hl.q
-
可选
默认值:
q
的值用于高亮显示的查询。此参数允许您高亮显示与用于搜索文档的术语或字段不同的术语或字段。设置此项时,您可能还需要设置
hl.qparser
。默认值是
q
参数的值(已解析)。 hl.qparser
-
可选
默认值:参见说明
用于
hl.q
查询的 查询解析器。它仅在设置hl.q
时适用。默认值是
defType
参数的值,而defType
参数的默认值又为lucene
。 hl.requireFieldMatch
-
可选
默认值:
false
如果为
false
,则所有查询术语都将针对每个要高亮显示的字段(hl.fl
)高亮显示,无论解析的查询引用哪些字段。如果设置为true
,则只有与正在高亮显示的字段对齐的查询术语才会被高亮显示。如果查询引用了与正在高亮的字段不同的字段,并且它们具有不同的文本分析,则查询可能不会高亮它应该高亮的查询词,反之亦然。所使用的分析是正在高亮的字段 (
hl.fl
) 的分析,而不是查询字段的分析。 hl.queryFieldPattern
-
可选
默认值:
none
类似于
hl.requireFieldMatch
,但允许多个字段匹配,例如q=fieldA:one OR fieldB:two OR fieldC:three
hl.fl=fieldA
hl.queryFieldPattern=fieldA,fieldB
还允许
hl.fl
字段在查询中不存在,例如q=fieldA:one OR fieldB:two
hl.fl=fieldZ
hl.queryFieldPattern=fieldA
如果同时指定了
hl.queryFieldPattern
和hl.requireFieldMatch=true
,则hl.queryFieldPattern
将被静默忽略。 hl.usePhraseHighlighter
-
可选
默认值:
true
如果设置为
true
,Solr 将准确地将短语查询(和其他高级位置敏感查询)高亮为短语。如果为false
,短语的各个部分将在任何地方高亮,而不仅仅是在形成给定短语时高亮。 hl.highlightMultiTerm
-
可选
默认值:
true
如果设置为
true
,Solr 将高亮通配符查询(和其他MultiTermQuery
子类)。如果为false
,它们将根本不会被高亮。 hl.snippets
-
可选
默认值:
1
指定每个字段生成的高亮片段的最大数量。可以生成从零到此值数量的片段。
hl.fragsize
-
可选
默认值:
100
指定要考虑用于高亮的片段的近似大小(以字符为单位)。使用
0
表示不应考虑任何片段,并且应使用整个字段值。 hl.tag.pre
-
可选
默认值:
<em>
(原始高亮器的
hl.simple.pre
)指定在高亮术语之前使用的“标签”。这可以是任何字符串,但通常是 HTML 或 XML 标签。 hl.tag.post
-
可选
默认值:
</em>
(原始高亮器的
hl.simple.post
)指定在高亮术语之后使用的“标签”。这可以是任何字符串,但通常是 HTML 或 XML 标签。 hl.encoder
-
可选
默认值:空
如果为空,则存储的文本将被返回,而不会执行高亮器执行的任何转义/编码。如果设置为
html
,则会对特殊的 HTML/XML 字符进行编码(例如,&
变为&
)。片段前后的字符永远不会被编码。 hl.maxAnalyzedChars
-
可选
默认值:
51200
查找高亮的字符限制,之后将不再进行高亮显示。这主要只是基于分析的偏移源的性能问题,因为它是速度最慢的。请参阅模式选项和性能注意事项。
根据所选的高亮显示器(通过hl.method
),还支持更多参数。
查询响应中的高亮显示
在对查询的响应中,Solr 在与文档分开的节中包含高亮显示数据。由客户端决定如何处理此响应并将高亮显示内容显示给用户。
使用 Solr 附带的示例文档,我们可以了解其工作原理
响应如下查询
http://localhost:8983/solr/gettingstarted/select?hl=on&q=apple&hl.fl=manu&fl=id,name,manu,cat
我们得到如下响应(略微截断以节省空间)
{
"response": {
"numFound": 1,
"start": 0,
"docs": [{
"id": "MA147LL/A",
"name": "Apple 60 GB iPod with Video Playback Black",
"manu": "Apple Computer Inc.",
"cat": [
"electronics",
"music"
]
}]
},
"highlighting": {
"MA147LL/A": {
"manu": [
"<em>Apple</em> Computer Inc."
]
}
}
}
请注意两个部分docs
和highlighting
。docs
部分包含使用查询的fl
参数请求的文档字段(仅“id”、“name”、“manu”和“cat”)。
highlighting
部分包括每个文档的 ID 以及包含高亮部分的字段。在此示例中,我们使用hl.fl
参数来说明我们希望在“manu”字段中高亮显示查询词。当该字段中存在与查询词匹配的内容时,它将包含在列表中每个文档 ID 中。
选择高亮显示器
Solr 提供了一个HighlightComponent
(SearchComponent
),它在搜索处理程序的默认组件列表中。它为多个实际的高亮显示实现/引擎(或简称“高亮显示器”)提供了一个统一的 API,这些引擎负责高亮显示业务。
多个高亮显示器支持许多参数,有时实现细节和语义会有些不同,因此在切换高亮显示器时不要指望结果相同。您应该使用hl.method
参数选择一个高亮显示器。
在运行时可以使用三个高亮显示器,可以通过 hl.method
参数选择,按一般建议的顺序排列
- 统一高亮显示器
-
(
hl.method=unified
)统一高亮显示器是最新高亮显示器(截至 Solr 6.4),作为最具性能和最准确的选择而脱颖而出。它可以通过插件/扩展处理典型要求和其他要求。我们建议您将此高亮显示器作为首选。
UH 非常准确地高亮显示查询,因此与底层 Lucene 查询实际匹配的内容一致。其他高亮显示器更自由地高亮显示术语(过度高亮显示)。对于深奥/自定义查询,此高亮显示器比其他高亮显示器更有可能支持它。
此高亮显示器的一个强大优势是您可以选择配置 Solr,以便在底层索引中放置更多信息,以加快大型文档的高亮显示;支持多种配置,甚至按字段支持。其他高亮显示器几乎没有或根本没有此类偏移源灵活性。下面对此进行更多介绍。
有一些理由不选择此高亮显示器:段落评分不考虑查询中的提升。一些用户希望获得更多/更好的段落拆分灵活性。“备用”后备选项更原始。
- 原始高亮显示器
-
(
hl.method=original
)原始高亮显示器有时称为“标准高亮显示器”或“默认高亮显示器”,是 Lucene 的原始高亮显示器——一种具有高度自定义选项的备受推崇的选择。它的查询准确性足以满足大多数需求,尽管它不像统一高亮显示器那样好/完美。
原始高亮显示器通常会动态分析存储的文本以进行高亮显示。如果可用,它将使用完整术语向量。如果文本未“存储”但位于文档值中(
docValues="true"
),此高亮显示器可以处理它。此高亮显示器不足之处在于性能;它通常比统一高亮显示器慢两倍。尽管它是最可定制的,但它没有基于 BreakIterator 的分段器(所有其他高亮显示器都有),这可能对某些语言构成挑战。
- 快速向量高亮显示器
-
(
hl.method=fastVector
)快速向量高亮显示器需要字段上的完整术语向量选项(
termVectors
、termPositions
和termOffsets
),并且针对此进行了优化。它几乎与原始高亮显示器一样可配置,具有一定的可变性。此高亮显示器尤其支持多色高亮显示,以便可以在段落中用不同的标记表示不同的查询词,通常表示为具有唯一颜色的 HTML 标记。
此高亮显示器的查询表示不如原始高亮显示器或统一高亮显示器高级:例如,它不能很好地与
surround
解析器配合使用,并且有多个报告的错误与带停用词的查询有关。
快速向量高亮显示器和原始高亮显示器都可以结合用于搜索请求,以便使用一种高亮显示器高亮显示一些字段,使用另一种高亮显示器高亮显示其他字段。相比之下,只能专门选择统一高亮显示器。
统一高亮器仅通过搜索参数进行配置。相比之下,原始高亮器和 FastVector 高亮器的一些设置在 solrconfig.xml
中设置。在“techproducts”配置集中有一个后者的强大示例。
除了以下更多信息之外,还可以在 Solr javadocs 中找到更多信息。
架构选项和性能注意事项
高亮的内部原理是检测与查询匹配的各个单词的偏移量。一些高亮器可以通过架构中定义的分析链运行存储的文本,一些高亮器可以从发布中查找它们,而一些高亮器可以从词向量中查找它们。这些选择有不同的权衡
-
分析:由统一高亮器和原始高亮器支持。如果您没有费尽心思配置以下其他选项,高亮器将在运行时(在高亮期间)分析存储的文本以计算偏移量。
这种方法的好处是您的索引不会因任何对高亮不绝对必要的数据而变大。
缺点是高亮速度与要处理的文本量大致成线性关系,一个很大的因素是分析链的复杂性。
对于“短”文本,这是一个不错的选择。或者它可能不短,但您优先考虑较小的索引和索引速度而不是高亮性能。
-
发布:由统一高亮器支持。将
storeOffsetsWithPositions
设置为true
。这会向索引添加适量额外数据,但会极大地加快高亮速度,尤其与较长的文本字段的分析相比。但是,除非添加“轻量”词向量,否则通配符查询将回退到分析。
-
带词向量(轻量):仅由统一高亮器支持。要启用此模式,请将
termVectors
设置为true
,但不要在要高亮的字段上设置任何其他与词向量相关的选项。这会向索引添加比仅仅
storeOffsetsWithPositions
更多的数据,但不会像启用所有额外的词向量选项那样多。仅当使用通配符查询时,高亮器才会访问词向量,并且会阻止回退到对存储文本进行分析。对于在大型文本字段上高亮通配符查询,这绝对是最快的选择。
-
-
词向量(完整):由统一高亮器、FastVector 高亮器和原始高亮器支持。将
termVectors
、termPositions
和termOffsets
设置为true
,对于高级用例,还可以将termPayloads
设置为true
。这会为索引增加相当大的权重——与压缩存储的文本大小类似。如果你正在使用统一高亮显示器,则不建议使用此配置,因为它比带有轻量级词向量的发布慢且更重。但是,如果出于其他用例已经需要完整的词向量,则这可能是有意义的。
统一高亮显示器
统一高亮显示器支持以下附加参数,这些参数在前面已列出
hl.offsetSource
-
可选
默认值:参见说明
默认情况下,统一高亮显示器通常会选择正确的偏移源(见上文)。但是,它可能模棱两可,例如在从一个偏移源迁移到另一个尚未完成的偏移源期间。
偏移源可以显式配置为以下之一:
ANALYSIS
、POSTINGS
、POSTINGS_WITH_TERM_VECTORS
或TERM_VECTORS
。 hl.fragAlignRatio
-
可选
默认值:
0.33
此参数影响段落中第一个匹配项(即高亮显示的文本)的位置。
默认值
0.33
表示将匹配项与左三分之一对齐。值0.0
表示将匹配项与左侧对齐,而1.0
表示将其与右侧对齐。此设置是一个尽力而为的提示,因为有多种因素。当有大量文本需要高亮显示时,降低此数字可以极大地提高性能。 hl.fragsizeIsMinimum
-
可选
默认值:
true
当为
true
时,hl.fragsize
参数被视为(软)最小片段大小;只要有足够的文本,片段至少有此大小。当为false
时,它是一个最佳目标——高亮显示器将平均生成此长度的高亮显示。false
设置较慢,尤其是在有大量文本且hl.bs.type=SENTENCE
时。 hl.tag.ellipsis
-
可选
默认值:参见说明
默认情况下,每个片段都作为单独的值返回(与其他高亮显示器所做的一样)。将此参数设置为用此文本作为分隔符返回一个字符串。注意:这在未来可能会被删除。
hl.defaultSummary
-
可选
默认值:
false
如果为
true
,则在无法生成正确的突出显示片段的情况下,使用文本的前导部分作为片段。 hl.score.k1
-
可选
默认值:
1.2
指定 BM25 词频归一化参数“k1”。例如,可以将其设置为
0
,以便仅根据匹配查询词的词数对段落进行排名。 hl.score.b
-
可选
默认值:
0.75
指定 BM25 长度归一化参数“b”。例如,可以将其设置为“0”,以便在排名时完全忽略段落的长度。
hl.score.pivot
-
可选
默认值:
87
指定 BM25 平均段落长度(以字符为单位)。
hl.bs.language
-
可选
默认值:无
指定用于将文档划分为段落的断句器语言。
hl.bs.country
-
可选
默认值:无
指定用于将文档划分为段落的断句器国家/地区。
hl.bs.variant
-
可选
默认值:无
指定用于将文档划分为段落的断句器变体。
hl.bs.type
-
可选
默认值:
SENTENCE
指定用于将文档划分为段落的断句器类型。可以是
SEPARATOR
、SENTENCE
、WORD
*、CHARACTER
、LINE
或WHOLE
。SEPARATOR
是一个特殊值,它在hl.bs.separator
中以用户提供的字符来拆分文本。 hl.bs.separator
-
可选
默认值:无
指示在哪个字符上拆分文本。仅在定义了
hl.bs.type=SEPARATOR
时使用。当文本已经过预处理,在所需的突出显示段落边界处具有特殊分隔符时,这很有用。此字符仍会作为段落的最后一个字符出现在文本中。
hl.weightMatches
-
可选
默认值:
true
指示 UH 使用 Lucene 的“权重匹配”API,而不是执行
SpanQuery
转换。这是反映查询的最准确的突出显示模式。此外,短语将整体突出显示,而不是逐字突出显示。目前,当突出显示多个字段时,此设置会极大地降低统一突出显示器的速度。如果
hl.usePhraseHighlighter
或hl.multiTermQuery
设置为false
,那么无论你将此设置设置为多少,此设置实际上都是false
。
原始突出显示器
原始突出显示器支持以下附加参数(除了前面列出的参数之外)
hl.mergeContiguous
-
可选
默认值:
false
指示 Solr 将连续片段合并为单个片段。值为
true
表示连续片段将合并为单个片段。 hl.maxMultiValuedToExamine
-
可选
默认值:
Integer.MAX_VALUE
指定在停止之前要检查的多值字段中的最大条目数。如果在找到任何匹配项之前达到限制,这可能会返回零结果。
如果与
maxMultiValuedToMatch
一起使用,则先达到哪个限制将决定何时停止查找。 hl.maxMultiValuedToMatch
-
可选
默认值:
Integer.MAX_VALUE
指定在停止之前在多值字段中找到的最大匹配数。
如果
hl.maxMultiValuedToExamine
也已定义,则将首先达到哪个限制,将决定何时停止查找。 hl.alternateField
-
可选
默认值:无
指定一个字段,如果 Solr 无法生成摘要(即,因为没有匹配的术语),则将其用作备份默认摘要。
hl.maxAlternateFieldLength
-
可选
默认值:
0
指定要返回的字段的最大字符数。任何小于或等于
0
的值表示字段长度不受限制。此参数仅与
hl.alternateField
参数结合使用。 hl.highlightAlternate
-
可选
默认值:
true
如果设置为
true
且hl.alternateFieldName
处于活动状态,则 Solr 将显示整个备用字段,并突出显示出现的次数。如果使用了hl.maxAlternateFieldLength=N
,则 Solr 将返回最佳匹配片段周围最多N
个字符。如果设置为
false
,或者备用字段中也没有匹配项,则备用字段将显示而不突出显示。 hl.formatter
-
可选
默认值:
simple
为突出显示的输出选择一个格式化程序。目前,唯一合法的值是
simple
,它用可自定义的前后文本片段包围突出显示的术语。 hl.simple.pre
、hl.simple.post
-
可选
默认值:参见说明
使用
simple
格式化程序时,指定在突出显示的术语之前(hl.simple.pre
)和之后(hl.simple.post
)应显示的文本。默认值为<em>
和</em>
。 hl.fragmenter
-
可选
默认值:
gap
为突出显示的文本指定一个文本片段生成器。标准片段生成器是
gap
,它为多值字段创建固定大小的片段,并留有间隙。另一个选项是
regex
,它尝试创建类似于指定正则表达式的片段。 hl.regex.slop
-
可选
默认值:
0.6
使用 regex 片段生成器(
hl.fragmenter=regex
)时,此参数定义了片段生成器偏离理想片段大小(由hl.fragsize
给定)以适应正则表达式的系数。例如,当
hl.fragsize=100
时,0.2
的 slop 应产生长度在 80 到 120 个字符之间的片段。在使用 regex 片段生成器时,通常最好提供一个稍小的hl.fragsize
值。 hl.regex.pattern
-
可选
默认值:无
指定用于片段化的正则表达式。这可用于提取句子。
hl.regex.maxAnalyzedChars
-
可选
默认值:
10000
指示 Solr 在使用 regex 片段生成器时仅分析字段中的这么多字符(之后,片段生成器会生成固定大小的片段)。
请注意,将复杂的 regex 应用于巨大的字段在计算上是昂贵的。
hl.preserveMulti
-
可选
默认值:
false
如果为
true
,则多值字段将按其在索引中保存的顺序返回所有值。如果为false
,则只返回与高亮请求匹配的值。 hl.payloads
-
可选
默认值:
true
当
hl.usePhraseHighlighter
为true
且索引字段具有有效负载但没有词向量(通常非常少见)时,索引的有效负载将与过帐一起读入高亮器的内存索引中。如果可能发生这种情况,并且您知道不需要它们进行高亮显示(即,您的查询不会按有效负载过滤),那么您可以通过将其设置为
false
来节省一些内存。
原始高亮器具有插件架构,可在 solrconfig.xml
中注册新功能。“techproducts”配置集明确显示了其中大部分设置。您可以将其用作指南,提供您自己的组件以包含 SolrFormatter
、SolrEncoder
和 SolrFragmenter.
快速矢量高亮器
如果并非所有字段都应使用 FVH 高亮显示,则快速矢量高亮器 (FVH) 可与原始高亮器结合使用。在这种模式下,为应使用 FVH 的所有字段设置 hl.method=original
和 f.yourTermVecField.hl.method=fastVector
。需要注意的一点是,原始高亮器使用 hl.simple.pre
,而 FVH(和其他高亮器)使用 hl.tag.pre
。
-
hl.alternateField
-
hl.maxAlternateFieldLength
-
hl.highlightAlternate
以下是 FVH 支持的其他参数
hl.fragListBuilder
-
可选
默认值:
weighted
代码段分段算法。
weighted
fragListBuilder 使用 IDF 权重对代码段进行排序。其他选项为
single
,它将整个字段内容作为一段代码段返回,或simple
。您可以使用此参数选择 fragListBuilder,或通过添加“default=true”修改solrconfig.xml
中的现有实现以使其成为默认值。 hl.fragmentsBuilder
-
可选
默认值:
default
代码段生成器负责格式化代码段,默认情况下使用
<em>
和</em>
标记(如果未定义hl.tag.pre
和hl.tag.post
)。另一个预配置选项是
colored
,它是一个示例,说明如何使用代码段生成器将 HTML 插入到代码段中以进行彩色高亮显示(如果您选择)。如果您愿意,您还可以实现自己的代码段生成器。您可以使用此参数选择代码段生成器,或通过添加“default=true”修改solrconfig.xml
中的现有实现以使其成为默认值。 hl.boundaryScanner
-
请参见下面的使用快速矢量高亮器和边界扫描器。
hl.bs.*
-
请参见下面的使用快速矢量高亮器和边界扫描器。
hl.phraseLimit
-
可选
默认值:
5000
在搜索最高得分词组时要分析的最大词组数。
hl.multiValuedSeparatorChar
-
可选
默认值:空格字符
用于将多值字段中的一个值与另一个值分隔开的文本。默认值为“”(空格)。
将边界扫描仪与 FastVector Highlighter 结合使用
FastVector Highlighter 偶尔会截断高亮显示的单词。为防止这种情况发生,请在 solrconfig.xml
中实现边界扫描仪,然后使用 hl.boundaryScanner
参数指定用于高亮显示的边界扫描仪。
Solr 支持两种边界扫描仪:breakIterator
和 simple
。
breakIterator 边界扫描仪
breakIterator
边界扫描仪开箱即用,可提供卓越的性能,因为它考虑了语言环境和边界类型。在大多数情况下,您会希望使用 breakIterator
边界扫描仪。要实现 breakIterator
边界扫描仪,请将此代码添加到 solrconfig.xml
文件的 highlighting
部分,根据应用程序适当调整类型、语言和国家/地区值
<boundaryScanner name="breakIterator" class="solr.highlight.BreakIteratorBoundaryScanner">
<lst name="defaults">
<str name="hl.bs.type">WORD</str>
<str name="hl.bs.language">en</str>
<str name="hl.bs.country">US</str>
</lst>
</boundaryScanner>
hl.bs.type
参数的可能值为 WORD、LINE、SENTENCE 和 CHARACTER。
simple 边界扫描仪
simple
边界扫描仪扫描术语边界,以查找指定的最大字符值 (hl.bs.maxScan
) 和常见的定界符,例如标点符号 (hl.bs.chars
)。要实现 simple
边界扫描仪,请将此代码添加到 solrconfig.xml
文件的 highlighting
部分,根据应用程序适当调整值
<boundaryScanner name="simple" class="solr.highlight.SimpleBoundaryScanner" default="true">
<lst name="defaults">
<str name="hl.bs.maxScan">10</str>
<str name="hl.bs.chars">.,!?\t\n</str>
</lst>
</boundaryScanner>