高亮显示

Solr 中的高亮显示允许将与用户查询匹配的文档片段包含在查询响应中。

这些片段包含在查询响应的特殊部分(highlighting 部分)中,客户端使用其中包含的格式提示来确定如何向用户呈现这些片段。片段是包含来自查询的匹配项的文档字段的一部分,有时也称为“片段”或“段落”。

高亮显示是可配置性极强的,或许比 Solr 的任何其他部分都高。有许多参数用于片段大小、格式、排序、备份/替代行为以及更多难以分类的选项。尽管如此,高亮显示非常易于使用。

用法

高亮显示要求您在模式中定义了 uniqueKey

常用高亮显示器参数

您需要设置 hl 并且通常需要设置 hl.fl 参数以启用返回高亮显示结果。下表记录了这些参数和其他一些支持的参数。请注意,许多高亮显示参数都支持每个字段的覆盖,例如:f.title_txt.hl.snippets

hl

可选

默认值:false

使用此参数启用或禁用高亮显示。如果要使用高亮显示,则必须将其设置为 true

hl.method

可选

默认值:unified

要使用的高亮显示实现/引擎。可接受的值包括:unifiedoriginalfastVector

有关可用高亮显示器之间差异的更多详细信息,请参阅下面的选择高亮显示器部分。

hl.fl

可选

默认值:df 的值

指定要高亮显示的字段列表,可以使用逗号或空格分隔。这些字段必须是“存储”的。可以使用 *(星号)通配符来匹配字段全局,例如 text_* 甚至 *,以便在所有可能高亮显示的字段上进行高亮显示。当使用 * 时,请考虑添加 hl.requireFieldMatch=true

请注意,此处列出的字段应与查询中引用的字段具有兼容的文本分析(在模式中定义)以进行高亮显示。可能需要修改 hl.qhl.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 参数的值,该参数又默认为 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.queryFieldPatternhl.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>

(Original Highlighter 的 hl.simple.pre)指定要在高亮显示的术语之前使用的“标签”。这可以是任何字符串,但最常见的是 HTML 或 XML 标签。

hl.tag.post

可选

默认值:</em>

(Original Highlighter 的 hl.simple.post)指定要在高亮显示的术语之后使用的“标签”。这可以是任何字符串,但最常见的是 HTML 或 XML 标签。

hl.encoder

可选

默认值:

如果为空,则将返回存储的文本,而不会执行高亮显示器的任何转义/编码。如果设置为 html,则会编码特殊的 HTML/XML 字符(例如,& 变为 &amp;)。代码片段前后的字符永远不会被编码。

hl.maxAnalyzedChars

可选

默认值:51200

查找高亮显示的字符限制,超过此限制将不进行高亮显示。这主要是基于分析的偏移量源的性能问题,因为它是最慢的。请参阅架构选项和性能注意事项

根据所选的高亮显示器(通过 hl.method)还支持更多参数。

查询响应中的高亮显示

在查询的响应中,Solr 在与文档分开的部分中包含高亮显示数据。客户端需要自行确定如何处理此响应并将高亮显示呈现给用户。

使用 Solr 附带的示例文档,我们可以看到这是如何工作的

为了响应这样的查询

https://127.0.0.1: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."
      ]
    }
  }
}

请注意 docshighlighting 两个部分。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 的原始高亮显示器 - 一个具有高度自定义选项的可敬选择。它的查询准确性足以满足大多数需求,尽管它不像统一高亮显示器那样好/完美。

原始高亮显示器通常会动态分析存储的文本以便高亮显示。如果可用,它将使用完整的术语向量。如果文本不是“存储”的,而是在 doc values 中(docValues="true"),则此高亮显示器可以使用它。

此高亮显示器的缺点是性能;它通常比统一高亮显示器慢两倍。尽管它是最可自定义的,但它没有基于 BreakIterator 的片段器(其他所有片段器都有),这可能会对某些语言构成挑战。

快速向量高亮显示器

hl.method=fastVector

快速向量高亮显示器要求字段具有完整的术语向量选项(termVectorstermPositionstermOffsets),并针对此进行了优化。它的配置几乎与原始高亮显示器一样,具有一定的可变性。

此高亮显示器尤其支持多色高亮显示,这样可以用不同的标记在片段中表示不同的查询词,通常表示为具有唯一颜色的 HTML 标签。

此高亮显示器的查询表示形式不如原始高亮显示器或统一高亮显示器高级:例如,它不能很好地与 surround 解析器一起使用,并且有多个报告的与带有停用词的查询相关的错误。

快速向量高亮显示器和原始高亮显示器都可以在搜索请求中结合使用,以使用一种高亮显示器高亮显示某些字段,而使用另一种高亮显示器高亮显示其他字段。相比之下,统一高亮显示器只能独占选择。

统一高亮显示器专门通过搜索参数进行配置。相比之下,原始高亮显示器和快速向量高亮显示器的某些设置在 solrconfig.xml 中设置。“techproducts” configset 中有一个关于后者的强大示例。

除了下面的更多信息外,还可以在 Solr javadocs 中找到更多信息。

架构选项和性能注意事项

高亮显示内部的基本要素是检测与查询匹配的各个单词的偏移量。一些高亮显示器可以通过架构中定义的分析链运行存储的文本,一些可以从发布中查找它们,一些可以从术语向量中查找它们。这些选择有不同的权衡

  • 分析:统一高亮显示器和原始高亮显示器支持。如果您不配置下面的其他选项,高亮显示器将在运行时(在高亮显示期间)分析存储的文本以计算偏移量。

    这种方法的好处是,您的索引不会因任何对高亮显示不是绝对必要的额外数据而增大。

    缺点是高亮显示速度与要处理的文本量大致呈线性关系,其中一个很大的因素是您的分析链的复杂性。

    对于“短”文本,这是一个不错的选择。或者可能它不短,但您优先考虑较小的索引和索引速度而不是高亮显示性能。

  • 发布:统一高亮显示器支持。将 storeOffsetsWithPositions 设置为 true。这会向索引添加适量的额外数据,但它会极大地加快高亮显示速度,尤其是与较长文本字段的分析相比。

    但是,通配符查询将回退到分析,除非添加“轻”术语向量。

    • 带有术语向量(轻量):仅统一高亮显示器支持。要启用此模式,请将 termVectors 设置为 true,但不要在高亮显示的字段上设置其他与术语向量相关的选项。

      这会向索引添加比仅 storeOffsetsWithPositions 更多的数据,但没有启用所有额外的术语向量选项那么多。仅当使用通配符查询时,高亮显示器才会访问术语向量,这将防止回退到存储文本的分析。

      对于高亮显示大型文本字段上的通配符查询来说,这绝对是最快的选择。

  • 术语向量(完整):统一高亮显示器、快速向量高亮显示器和原始高亮显示器支持。将 termVectorstermPositionstermOffsets 设置为 true,并可能为高级用例设置 termPayloads

    这会为索引增加很大的权重 - 与压缩的存储文本大小相似。如果您正在使用统一高亮显示器,则不建议使用此配置,因为它比带有轻术语向量的发布慢且重。但是,如果出于其他用例已经需要完整的术语向量,则这可能是有意义的。

统一高亮显示器

统一高亮显示器支持以下额外参数,除了前面列出的参数之外

hl.offsetSource

可选

默认值:见描述

默认情况下,统一高亮器通常会选择正确的偏移源(请参阅上文)。但是,在从一个偏移源迁移到另一个尚未完成的偏移源时,可能会出现歧义。

偏移源可以显式配置为以下之一:ANALYSISPOSTINGSPOSTINGS_WITH_TERM_VECTORSTERM_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

可选

默认值:无

指定用于将文档划分为段落的 breakiterator 语言。

hl.bs.country

可选

默认值:无

指定用于将文档划分为段落的 breakiterator 国家/地区。

hl.bs.variant

可选

默认值:无

指定用于将文档划分为段落的 breakiterator 变体。

hl.bs.type

可选

默认值:SENTENCE

指定用于将文档划分为段落的 breakiterator 类型。可以是 SEPARATORSENTENCEWORD*、CHARACTERLINEWHOLESEPARATOR 是特殊值,它会根据 hl.bs.separator 中用户提供的字符拆分文本。

hl.bs.separator

可选

默认值:无

指示在哪个字符上拆分文本。仅当您定义了 hl.bs.type=SEPARATOR 时才使用此参数。

当文本已预先操作以在所需的高亮段落边界处具有特殊的分界字符时,此参数很有用。此字符仍将作为段落的最后一个字符出现在文本中。

hl.weightMatches

可选

默认值:true

告知 UH 使用 Lucene 的“权重匹配”API 而不是进行 SpanQuery 转换。这是最准确的高亮显示模式,可反映查询。此外,短语将作为一个整体而不是逐词高亮显示。当前,当突出显示多个字段时,此设置会大大降低统一高亮器的速度。

如果将 hl.usePhraseHighlighterhl.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

如果设置为 truehl.alternateFieldName 处于活动状态,Solr 将显示整个备用字段,并突出显示出现的位置。如果使用 hl.maxAlternateFieldLength=N,Solr 将返回围绕最佳匹配代码段的最大 N 个字符。

如果设置为 false,或者备用字段中也没有匹配项,则将显示备用字段而不突出显示。

hl.formatter

可选

默认值:simple

为突出显示的输出选择格式化程序。当前,唯一合法的值是 simple,它使用可自定义的前置和后置文本代码段包围突出显示的术语。

hl.simple.prehl.simple.post

可选

默认值:见描述

指定在使用 simple 格式化程序时,应在突出显示的术语之前 (hl.simple.pre) 和之后 (hl.simple.post) 显示的文本。默认值是 <em></em>

hl.fragmenter

可选

默认值:gap

指定突出显示的文本的文本代码段生成器。标准片段化器是 gap,它会为多值字段创建具有间隙的固定大小片段。

另一个选项是 regex,它尝试创建类似于指定正则表达式的片段。

hl.regex.slop

可选

默认值:0.6

当使用正则表达式片段化器 (hl.fragmenter=regex) 时,此参数定义片段化器偏离理想片段大小(由 hl.fragsize 给定)以适应正则表达式的因子。

例如,当 hl.fragsize=100 时,松弛值 0.2 应生成长度在 80 到 120 个字符之间的片段。使用正则表达式片段化器时,通常最好提供稍微小一点的 hl.fragsize 值。

hl.regex.pattern

可选

默认值:无

指定用于片段化的正则表达式。这可以用于提取句子。

hl.regex.maxAnalyzedChars

可选

默认值:10000

指示 Solr 在使用正则表达式片段化器时仅分析字段中的这么多字符(之后,片段化器会生成固定大小的片段)。

请注意,将复杂的正则表达式应用于巨大的字段在计算上非常昂贵。

hl.preserveMulti

可选

默认值:false

如果为 true,则多值字段将按它们在索引中保存的顺序返回所有值。如果为 false,则仅返回与突出显示请求匹配的值。

hl.payloads

可选

默认值:true

hl.usePhraseHighlightertrue 且索引的字段具有有效负载但没有词条向量(通常很少见)时,索引的有效负载将与倒排表一起读取到高亮器的内存索引中。

如果可能发生这种情况,并且您知道您不需要它们进行突出显示(即,您的查询不按有效负载进行过滤),则可以通过将此项设置为 false 来节省少量内存。

原始高亮器具有一个插件体系结构,可以在 solrconfig.xml 中注册新功能。“techproducts”配置集显式显示了大多数这些设置。您可以将其用作指南,以提供您自己的组件来包含 SolrFormatterSolrEncoderSolrFragmenter

快速向量高亮器

如果并非所有字段都应使用 FVH 突出显示,则可以将快速向量高亮器 (FVH) 与原始高亮器结合使用。在这种模式下,对于应使用 FVH 的所有字段,请设置 hl.method=originalf.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。您可以使用此参数选择 fragListBuilder,或者在 solrconfig.xml 中修改现有实现以通过添加“default=true”使其成为默认值。

hl.fragmentsBuilder

可选

默认值:default

片段生成器负责格式化片段,默认情况下使用 <em></em> 标记(如果未定义 hl.tag.prehl.tag.post)。

另一个预配置的选择是 colored,它演示了如何使用片段生成器在代码段中插入 HTML 以便在您选择的情况下进行彩色高亮显示。您也可以实现自己的代码段(如果您愿意)。您可以使用此参数选择片段生成器,或者在 solrconfig.xml 中修改现有实现以通过添加“default=true”使其成为默认值。

hl.boundaryScanner

请参阅下面的将边界扫描器与快速向量高亮器一起使用

hl.bs.*

请参阅下面的将边界扫描器与快速向量高亮器一起使用

hl.phraseLimit

可选

默认值:5000

在搜索得分最高的短语时要分析的最大短语数。

hl.multiValuedSeparatorChar

可选

默认值:空格字符

用于分隔多值字段中一个值与下一个值的文本。默认值为“ ”(空格)。

将边界扫描器与快速向量高亮器一起使用

快速向量高亮器有时会截断突出显示的词。为了防止这种情况,请在 solrconfig.xml 中实现边界扫描器,然后使用 hl.boundaryScanner 参数指定用于突出显示的边界扫描器。

Solr 支持两个边界扫描器:breakIteratorsimple

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 边界扫描器扫描指定的最大字符值 (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>