查询提升组件
查询提升组件允许你配置给定查询的最高结果,而无需考虑正常的 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
文档转换器和 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
当一个筛选器被标记为排除时,它不会被完全忽略;而是被修改,以便提升后的文档可以传递。未提升的文档仍然受筛选器约束。