Solr中的高亮显示功能允许匹配用户查询的文档片段包含在查询响应中。
这些片段包含在查询响应的特殊部分(highlighting
部分),客户端使用包含的格式化线索来决定如何向用户呈现片段。片段是包含查询匹配的文档字段的一部分,有时也称为”摘要”或”段落”。
高亮显示是高度可配置的,可能比Solr的任何其他部分都更加灵活。有许多参数分别用于片段大小、格式化、排序、备用/替代行为以及其他难以分类的选项。尽管如此,高亮显示使用起来非常简单。
使用方法
高亮显示要求你在模式中定义一个uniqueKey
。
通用高亮显示参数
你需要设置hl
参数,通常还需要hl.fl
参数来启用返回高亮显示结果。下表记录了这些参数和其他一些支持的参数。注意许多高亮显示参数支持字段级覆盖,如:f._title_txt_.hl.snippets
。
hl
必需性 | 默认值 |
---|---|
可选 | false |
使用此参数启用或禁用高亮显示。如果要使用高亮显示,必须将此设置为true
。
hl.method
必需性 | 默认值 |
---|---|
可选 | unified |
要使用的高亮显示实现/引擎。可接受的值有:unified
、original
、fastVector
。
参见下面的”选择高亮显示器”部分了解可用高亮显示器之间差异的更多详情。
hl.fl
必需性 | 默认值 |
---|---|
可选 | df 的值 |
指定要高亮显示的字段列表,用逗号或空格分隔。这些字段必须是”存储的”。可以使用通配符*
(星号)来匹配字段模式,如text_*
甚至*
来在所有可能的字段上高亮显示。使用*
时,考虑添加hl.requireFieldMatch=true
。
注意这里列出的字段应该与查询中引用的字段有兼容的文本分析(在模式中定义)才能被高亮显示。可能需要修改hl.q
和hl.qparser
和/或修改文本分析。
以下示例使用本地参数语法和eDisMax查询解析器来高亮显示hl.fl
中的字段:
1 | &hl.fl=field1 field2&hl.q={!edismax qf=$hl.fl v=$q}&hl.qparser=lucene&hl.requireFieldMatch=true |
默认值是df
参数的值,该参数本身没有默认值。
hl.q
必需性 | 默认值 |
---|---|
可选 | q 的值 |
用于高亮显示的查询。此参数允许你高亮显示不同于用于搜索文档的词或字段。设置此参数时,可能还需要设置hl.qparser
。
默认值是q
参数的值(已解析)。
hl.qparser
必需性 | 默认值 |
---|---|
可选 | 见描述 |
用于hl.q
查询的查询解析器。只在设置hl.q
时适用。
默认值是defType
参数的值,该参数默认为lucene
。
hl.requireFieldMatch
必需性 | 默认值 |
---|---|
可选 | false |
如果为false
,所有查询词都将在每个要高亮显示的字段(hl.fl
)中高亮显示,无论解析的查询引用什么字段。如果设置为true
,只有与被高亮显示字段对齐的查询词才会被高亮显示。
如果查询引用的字段与被高亮显示的字段不同且它们有不同的文本分析,查询可能不会高亮显示应该高亮显示的查询词,反之亦然。使用的分析是被高亮显示字段(hl.fl
)的分析,而不是查询字段的分析。
hl.queryFieldPattern
必需性 | 默认值 |
---|---|
可选 | none |
类似于hl.requireFieldMatch
但允许多个字段匹配,例如:
1 | q=fieldA:one OR fieldB:two OR fieldC:three |
也允许hl.fl
字段在查询中不存在,例如:
1 | q=fieldA:one OR fieldB:two |
如果同时指定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包含的示例文档,我们可以看看这是如何工作的:
响应如下查询:
1 | http://localhost:8983/solr/gettingstarted/select?hl=on&q=apple&hl.fl=manu&fl=id,name,manu,cat |
我们得到这样的响应(为节省空间略有截断):
1 | { |
注意两个部分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的片段器(其他所有都有),这可能对某些语言构成挑战。
FastVector高亮显示器
hl.method=fastVector
FastVector高亮显示器要求字段上的完整词向量选项(termVectors
、termPositions
和termOffsets
),并以此为目标进行优化。它几乎与原始高亮显示器一样可配置,有一些变化。
此高亮显示器显著支持多色高亮显示,这样不同的查询词可以在片段中用不同的标记表示,通常表达为具有唯一颜色的HTML标签。
此高亮显示器的查询表示不如原始或统一高亮显示器先进:例如,它不能很好地与surround
解析器一起工作,并且有多个与包含停用词的查询相关的报告错误。
FastVector和原始高亮显示器都可以在搜索请求中结合使用,以用一个高亮显示某些字段,用另一个高亮显示其他字段。相比之下,统一高亮显示器只能独占选择。
统一高亮显示器完全通过搜索参数配置。相比之下,原始和FastVector高亮显示器的某些设置在solrconfig.xml
中设置。”techproducts”配置集中有后者的强大示例。
模式选项和性能考虑
高亮显示内部的基础是检测匹配查询的单个词的偏移量。一些高亮显示器可以通过模式中定义的分析链运行存储的文本,一些可以从词条中查找它们,一些可以从词向量中查找它们。这些选择有不同的权衡:
分析:由统一和原始高亮显示器支持。如果你不专门配置下面的其他选项,高亮显示器将即时分析存储的文本(在高亮显示期间)来计算偏移量。
这种方法的好处是你的索引不会因为对高亮显示不是严格必要的任何额外数据而变大。
缺点是高亮显示速度与要处理的文本量大致成线性关系,一个大因素是分析链的复杂性。
对于”短”文本,这是一个好选择。或者也许它不短,但你优先考虑较小的索引和索引速度而不是高亮显示性能。
词条:由统一高亮显示器支持。将
storeOffsetsWithPositions
设置为true
。这向索引添加了适量的额外数据,但它极大地加速了高亮显示,特别是与对较长文本字段的分析相比。但是,通配符查询将回退到分析,除非添加”轻”词向量。
带词向量(轻):仅由统一高亮显示器支持。要启用此模式,将
termVectors
设置为true
,但不在被高亮显示的字段上设置其他词向量相关选项。这比仅
storeOffsetsWithPositions
向索引添加了更多数据,但不如启用所有额外词向量选项那样多。词向量仅在使用通配符查询时由高亮显示器访问,将防止回退到存储文本的分析。这绝对是在大文本字段上高亮显示通配符查询的最快选项。
词向量(完整):由统一、FastVector和原始高亮显示器支持。将
termVectors
、termPositions
和termOffsets
设置为true
,对于高级用例可能还要设置termPayloads
。这向索引添加了大量权重——类似于压缩存储文本的大小。如果你使用统一高亮显示器,那么这不是推荐的配置,因为它比带轻词向量的词条更慢更重。但是,如果完整词向量已经需要用于另一个用例,这可能是有意义的。
统一高亮显示器
统一高亮显示器支持以下附加参数,除了前面列出的参数:
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
:指定断点迭代器类型(SEPARATOR
、SENTENCE
、WORD
、CHARACTER
、LINE
或WHOLE
)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
hl.simple.pre
、hl.simple.post
:指定使用simple
格式化器时高亮显示词前后应出现的文本
片段化参数
hl.fragmenter
:为高亮显示的文本指定文本片段生成器(gap
或regex
)hl.regex.slop
:使用regex片段化器时的松弛因子hl.regex.pattern
:指定片段化的正则表达式hl.regex.maxAnalyzedChars
:使用regex片段化器时分析的最大字符数
其他参数
hl.preserveMulti
:如果为true
,多值字段将按照在索引中保存的顺序返回所有值hl.payloads
:当hl.usePhraseHighlighter
为true
且索引字段有负载时的内存优化选项
原始高亮显示器具有插件架构,可以在solrconfig.xml
中注册新功能。”techproducts”配置集明确显示了这些设置中的大多数。你可以使用它作为指南来提供你自己的组件,包括SolrFormatter
、SolrEncoder
和SolrFragmenter
。
FastVector高亮显示器
FastVector高亮显示器(FVH)可以与原始高亮显示器结合使用,如果不是所有字段都应该用FVH高亮显示。在这种模式下,设置hl.method=original
,并为所有应该使用FVH的字段设置f.yourTermVecField.hl.method=fastVector
。要记住的一个烦恼是原始高亮显示器使用hl.simple.pre
,而FVH(和其他高亮显示器)使用hl.tag.pre
。
除了上面的通用高亮显示器参数,FVH还支持原始高亮显示器的以下参数:
hl.alternateField
hl.maxAlternateFieldLength
hl.highlightAlternate
FVH特有参数
hl.fragListBuilder
必需性 | 默认值 |
---|---|
可选 | weighted |
片段化算法。weighted
fragListBuilder使用IDF权重来排序片段。
其他选项是single
(将整个字段内容作为一个片段返回)或simple
。
hl.fragmentsBuilder
必需性 | 默认值 |
---|---|
可选 | default |
片段构建器负责格式化片段,默认使用<em>
和</em>
标记(如果未定义hl.tag.pre
和hl.tag.post
)。
另一个预配置选择是colored
,这是如何使用片段构建器将HTML插入到片段中以进行彩色高亮显示的示例。
hl.boundaryScanner
参见下面的”FastVector高亮显示器的边界扫描器”。
hl.phraseLimit
必需性 | 默认值 |
---|---|
可选 | 5000 |
在寻找最高分短语时分析的最大短语数。
hl.multiValuedSeparatorChar
必需性 | 默认值 |
---|---|
可选 | 空格字符 |
用于多值字段中分隔一个值与下一个值的文本。默认是” “(空格)。
使用边界扫描器
FastVector高亮显示器偶尔会截断高亮显示的词。为防止这种情况,在solrconfig.xml
中实现边界扫描器,然后使用hl.boundaryScanner
参数为高亮显示指定边界扫描器。
Solr支持两个边界扫描器:breakIterator
和simple
。
breakIterator边界扫描器
breakIterator
边界扫描器通过考虑区域设置和边界类型开箱即用地提供出色的性能。在大多数情况下,你会希望使用breakIterator
边界扫描器。
simple边界扫描器
simple
边界扫描器扫描指定最大字符值(hl.bs.maxScan
)和常见分隔符如标点符号(hl.bs.chars
)的词边界。
总结
Solr的高亮显示功能为搜索结果提供了强大的可视化增强,通过多种高亮显示器选项和丰富的配置参数,可以满足不同场景的需求。统一高亮显示器是推荐的首选,提供最佳的性能和准确性,而原始高亮显示器和FastVector高亮显示器则在特定场景下有各自的优势。