查询提升组件

查询提升组件允许你配置给定查询的最高结果,而无需考虑正常的 Lucene 评分。

这有时被称为“赞助搜索”、“编辑提升”或“最佳选择”。此组件将用户查询文本与配置的最高结果映射相匹配。文本可以是任何字符串或非字符串 ID,只要已编入索引即可。虽然此组件适用于任何 QueryParser,但最适合与DisMax 查询解析器扩展 DisMax (eDisMax) 查询解析器配合使用。

查询提升组件还支持分布式搜索。

本节中使用的所有示例配置和查询都假定你正在运行 Solr 的“techproducts”示例

bin/solr -e techproducts

配置查询提升组件

你可以在 solrconfig.xml 文件中配置查询提升组件。可以将诸如 QueryElevationComponent 的搜索组件添加到任何请求处理程序;这里出于简洁考虑而使用了专门的请求处理程序。

<searchComponent name="elevator" class="solr.QueryElevationComponent" >
  <!-- pick a fieldType to analyze queries -->
  <str name="queryFieldType">string</str>
  <str name="config-file">elevate.xml</str>
</searchComponent>

<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
  </lst>
  <arr name="last-components">
    <str>elevator</str>
  </arr>
</requestHandler>

或者,你还可以通过查询提升组件配置指定以下内容,以区分编辑结果和“正常”结果

<str name="editorialMarkerFieldName">foo</str>

查询提升搜索组件采用以下参数

queryFieldType

必需

默认值:无

指定应使用哪个字段类型来分析传入文本。例如,使用具有 LowerCaseFilter 的字段类型可能是合适的。

另一个示例是,如果你需要取消转义反斜杠转义的查询,则可以定义字段类型以使用 PatternReplaceCharFilter 预处理。以下是字段类型的相应示例

<fieldType name="unescapelowercase" class="solr.TextField">
  <analyzer>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\\(.)" replacement="$1"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

例如,要仅取消转义非字母数字字符,模式可以是 \\([^\p{IsAlphabetic}\p{Digit}])

config-file

必需

默认值:无

定义提升规则的文件路径。此文件必须存在于配置集中。与大多数配置不同,如果文件在提交后发生更改,此组件将重新读取其配置。但是,这在 SolrCloud 中不起作用,必须有实际的索引更改,提交才能生效,才能用作获取更改的一种方式。在所有情况下,都可以重新加载受影响的核心/集合,以在配置集中使用任何新配置。

forceElevation

可选

默认值:false

默认情况下,此组件会遵守请求的sort参数:如果请求按日期排序,它将按日期对结果进行排序。如果forceElevation=true,结果将首先返回提升的文档,然后按日期排序。此项的默认值为false。这也是一个请求参数,它将覆盖配置。

useConfiguredElevatedOrder

可选

默认值:true

当提升多个文档时,它们的相对顺序应该是配置文件中的顺序,还是应该受排序条件的约束?这也是一个请求参数,它将覆盖配置。当forceElevation为 true 并且对字段进行排序时,效果最明显。

elevateOnlyDocsMatchingQuery

可选

默认值:false

默认情况下,此组件还会提升不属于搜索结果(与查询匹配)的文档。如果只想提升搜索结果中包含的文档,请将其设置为true

elevate.xml 文件

可以在config-file参数中指定的外部 XML 文件中配置提升的查询结果。elevate.xml文件可能如下所示

<elevate>
  <query text="foo bar">
    <doc id="1" />
    <doc id="2" />
    <doc id="3" />
  </query>

  <query text="ipod">
    <doc id="MA147LL/A" />  <!-- put the actual ipod at the top -->
    <doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
  </query>

  <query text="foo bill" match="subset">
    <doc id="11" />
  </query>
</elevate>

在此示例中,查询“foo bar”将首先返回文档 1、2 和 3,然后返回针对相同查询通常显示的任何内容。对于查询“ipod”,它将首先返回“MA147LL/A”,并确保“IW-02”不在结果集中。

请注意第三条规则中值为"subset"match参数。查询“bill bar foo”将触发此规则,因为该规则定义了一组术语以任何顺序出现在查询中。此查询将提升文档 11 到顶部。match参数接受"exact"(默认值)或"subset"值。子集匹配具有可扩展性,人们可以添加许多具有match="subset"参数的规则。

如果要提升的文档未在 elevate.xml 文件中定义,则应在查询时使用 elevateIds 参数传入。

使用查询提升组件

enableElevation 参数

为了调试,查看有提升文档和无提升文档的结果可能很有用。要隐藏结果,请使用 enableElevation=false

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true
http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=false

forceElevation 参数

可以通过将 forceElevation=true 添加到查询 URL 来在运行时强制提升

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true&forceElevation=true

exclusive 参数

可以通过将 exclusive=true 添加到 URL 来强制 Solr 仅返回提升文件中指定的结果

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&exclusive=true

useConfiguredElevatedOrder 参数

可以通过将其作为请求参数提供,在运行时强制设置 useConfiguredElevatedOrder

文档转换器和 markExcludes 参数

[elevated] 文档转换器可用于为每个文档添加有关是否提升的注释

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&fl=id,[elevated]

同样,在排除故障时,查看所有匹配文档(包括提升配置通常会排除的文档)可能会有所帮助。这可以通过使用 markExcludes=true 参数,然后使用 [excluded] 转换器来实现

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&markExcludes=true&fl=id,[elevated],[excluded]

elevateIds 和 excludeIds 参数

当提升组件正在使用时,可以在请求时覆盖查询的预配置提升列表,以使用这些请求参数中指定唯一键。

例如,在下面的请求中,文档 3007WFP 和 9885A004 将被提升,而文档 IW-02 将被排除——无论在 elevate.xml 中为查询“cable”配置了哪些提升或排除。

http://localhost:8983/solr/techproducts/elevate?q=cable&df=text&excludeIds=IW-02&elevateIds=3007WFP,9885A004

如果在请求时指定了这两个参数中的任何一个,则将忽略查询的整个提升配置。

例如,在下面的请求中,文档 IW-02 和 F8V7067-APL-KIT 将被提升,并且没有文档将被排除——无论在 elevate.xml 中为查询“ipod”配置了哪些提升或排除。

http://localhost:8983/solr/techproducts/elevate?q=ipod&df=text&elevateIds=IW-02,F8V7067-APL-KIT

fq 参数与提升

默认情况下,查询提升会遵循标准过滤器查询 (fq) 参数。也就是说,如果查询包含 fq 参数,则所有结果都将位于该过滤器内,即使 elevate.xml 将其他文档添加到结果集中也是如此。

如果您希望提升后的文档包含在结果集中,无论它们是否与特定的筛选器查询匹配,您可以使用 LocalParams 语法 标记这些筛选器查询,然后通过 elevate.excludeTags 请求参数指定要排除的标记。tag 本地参数和 elevate.excludeTags 请求参数都可以通过逗号分隔指定多个值。

q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&elevate.excludeTags=dt
q=mainquery&fq=status:public&fq={!tag=t1,t2}a:b&fq={!tag=t3}c:d&fq={!tag=t4}e:f&elevate.excludeTags=t1,t4

当一个筛选器被标记为排除时,它不会被完全忽略;而是被修改,以便提升后的文档可以传递。未提升的文档仍然受筛选器约束。