查询提升组件

查询提升组件允许您为给定的查询配置顶部结果,而无需考虑正常的 Lucene 评分。

这有时称为“赞助搜索”、“编辑提升”或“最佳选择”。此组件将用户查询文本与配置的顶部结果映射进行匹配。文本可以是任何字符串或非字符串 ID,只要它被索引即可。尽管此组件可与任何 QueryParser 一起使用,但最好与 DisMax 查询解析器扩展 DisMax (eDisMax) 查询解析器一起使用。

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

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

bin/solr start -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

必需

默认值:无

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

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

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

forceElevation 参数

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

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

exclusive 参数

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

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

useConfiguredElevatedOrder 参数

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

文档转换器和 markExcludes 参数

可以使用 [elevated] 文档转换器来注释每个文档,其中包含有关是否已提升的信息

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

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

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

elevateIds 和 excludeIds 参数

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

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

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

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

例如,在下面的请求中,文档 IW-02 和 F8V7067-APL-KIT 将被提升,并且不会排除任何文档,而不管在 elevate.xml 中为查询 "ipod" 配置了哪些提升或排除项。

https://127.0.0.1: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

当标记排除过滤器时,它不会被完全忽略;而是对其进行修改,以便提升的文档可以通过。未提升的文档仍然受过滤器约束。