请求处理器和搜索组件
在 solrconfig.xml
的 <query>
部分之后,配置请求处理器和搜索组件。
请求处理器处理发送到 Solr 的请求。这些可能是查询请求、索引更新请求或专门的交互,例如 Ping。
并非所有处理器都在 solrconfig.xml
中显式定义,许多处理器是隐式定义的。有关详细信息,请参阅 隐式请求处理器。
此外,可以通过使用 配置 API 在 configoverlay.json
中定义或覆盖处理器。最后,也可以通过 请求参数 API 定义独立的参数集。它们将存储在 params.json
文件中,并通过 useParams 引用。
所有这些多层配置都可以通过 配置 API 进行验证。
定义您自己的配置处理器通常是为支持业务案例和简化客户端 API 提供默认值和高级配置的有用方法。同时,使用本指南中解释的每一个选项,肯定会导致对实际使用哪个参数感到困惑。
定义和调用请求处理器
每个请求处理器都使用名称和类进行定义。请求处理器的名称在对 Solr 的请求中引用,通常作为路径。例如,如果 Solr 安装在 https://127.0.0.1:8983/solr/
,并且您有一个名为 "gettingstarted" 的集合,则可以发出如下请求
https://127.0.0.1:8983/solr/gettingstarted/select?q=solr
此查询将由名为 /select
的请求处理器处理。我们这里只使用了 "q" 参数,其中包含我们的查询词,一个简单的 "solr" 关键字。如果请求处理器定义了更多默认参数,则除非客户端(或用户)在查询本身中覆盖这些参数,否则这些参数将与我们发送到该请求处理器的任何查询一起使用。
如果您定义了另一个请求处理器,则可以使用该名称发送请求。例如,/update
是一个隐式请求处理器,用于处理索引更新(即,向索引发送新文档)。默认情况下,/select
是一个用于处理查询请求的请求处理器,并且是大多数示例和工具所期望的。
请求处理器还可以处理名称中嵌套路径的请求,例如,使用 /myhandler/extrapath
的请求可以由注册名称为 /myhandler
的请求处理器处理。如果请求处理器由名称 /myhandler/extrapath
显式定义,则它将优先于嵌套路径。这假设您正在使用 Solr 包含的请求处理器类;如果您创建自己的请求处理器,则应确保它包含处理嵌套路径的能力(如果您想将它们与自定义请求处理器一起使用)。
如果请求处理器不经常使用,则可以使用 startup="lazy"
标记,以避免在需要之前加载。
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
...
</requestHandler>
配置请求处理器
在请求处理器的定义中有 3 种配置方式,以及在其他位置配置它们的另外 3 种方式。
请求参数(GET 和 POST)
最简单和最灵活的方法是使用标准 GET 或 POST 请求提供参数。
以下是将参数 id
、fl
和 wt
发送到 /select
搜索处理程序的示例。请注意,fl
参数的值的 URL 编码空格(为 +)。
https://127.0.0.1:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name&wt=xml
以下示例是通过 POST 表单使用 JSON 请求 API 将参数发送到 /query
搜索处理程序的示例。
curl https://127.0.0.1:8983/solr/techproducts/query -d '
{
"query" : "memory",
"filter" : "inStock:true"
}'
无论哪种方式,参数都会被提取并与其他下面解释的选项组合在一起。
默认值、附加值和不变量
默认值
配置请求处理程序最常见的方式是提供 defaults
部分。除非被其他方法覆盖,否则此处定义的参数将被使用。
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
</requestHandler>
此示例定义了一个有用的故障排除参数 echoParams,其值仅返回请求本身定义的参数(不包括默认值),设置为 all
可获取更多信息。它还定义了 rows
参数,用于指定返回的结果数量(每页)(实际上,10 是真正的默认值,因此如果您不打算修改它,这是一个冗余的定义)。
另请注意,如果参数是字符串、整数或其他类型,则在列表中定义默认值的方式会有所不同。
以下是一些其他基本类型的表示方式
<lst name="defaults">
<float name="hl.regex.slop">0.5</float>
<bool name="default">true</bool>
</lst>
可能存在其他特殊类型,它们将在相关组件的章节中进行说明。
追加(Appends)
在 appends
部分,您可以定义添加到其他地方已定义的参数。当同一个参数可以被多次有意义地定义时,例如对于 过滤器查询,这些参数非常有用。Solr 中没有机制允许客户端覆盖这些添加项,因此您应该绝对确定始终希望将这些参数应用于查询。
<lst name="appends">
<str name="fq">inStock:true</str>
</lst>
在此示例中,过滤器查询 inStock:true
将始终添加到每个查询中,强制仅返回可用的“产品”。
不变参数(Invariants)
在 invariants
部分,您可以定义客户端无法覆盖的参数。无论用户、客户端、在 defaults
中还是在 appends
中指定的值如何,始终都会使用 invariants
部分中定义的值。
<lst name="invariants">
<str name="facet.field">cat</str>
<str name="facet.field">manu_exact</str>
<str name="facet.query">price:[* TO 500]</str>
<str name="facet.query">price:[500 TO *]</str>
</lst>
在此示例中,facet.field
和 facet.query
参数将被固定,限制客户端可以使用的 facet。默认情况下不会启用 Faceting,但如果客户端在请求中指定 facet=true
,则无论他们可能指定什么其他 facet.field
或 facet.query
参数,他们都只能看到这些 facet 的计数。
InitParams
还可以使用名为 initParams
的部分为请求处理程序配置默认值。当您想要拥有每个单独的处理程序都将使用的公共属性时,可以使用这些默认值。例如,如果您打算创建多个请求处理程序,它们都将在响应中请求相同的字段列表,则可以使用您的字段列表配置 initParams
部分。有关 initParams
的更多信息,请参阅 InitParams 部分。
参数集(Paramsets)和 UseParams
如果您希望经常更改参数,或者想要定义可以动态应用的参数集,可以使用 请求参数 API 定义它们,然后在处理程序定义本身中或作为查询参数,通过提供一个或多个 useParams
设置来调用它们。
<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">
...
</requestHandler>
https://127.0.0.1/solr/techproducts/select?useParams=myFacets,myQueries
如果调用了未定义的参数集,则会忽略它。这允许大多数 隐式请求处理程序 调用您可以稍后根据需要定义的特定参数集。
搜索处理程序
搜索处理程序对 Solr 非常重要,因为数据(大致)索引一次,但会被搜索多次。Solr(和 Lucene)的整个设计都在优化用于搜索的数据,而搜索处理程序是通向该数据的灵活网关。
以下部分允许在搜索处理程序中使用
<requestHandler name="/select" class="solr.SearchHandler">
... defaults/appends/invariants
... first-components/last-components or components
... shardHandlerFactory
</requestHandler>
所有块都是可选的,特别是自从也可以使用 initParams
和 useParams
提供参数以来。
defaults
/appends
/invariants
块已在前面的 默认值、追加和不变参数 中进行了描述。所有查询参数都可以定义为任何搜索处理程序的参数。
接下来将介绍搜索组件块,而 shardHandlerFactory 用于微调 SolrCloud 分布式请求。
定义搜索组件
搜索组件本身在请求处理程序之外定义,然后从想要使用它们的各种搜索处理程序引用。大多数搜索处理程序使用默认的隐式搜索组件堆栈,并且有时只需要使用前置或后置的附加组件来增强它们。完全覆盖组件堆栈的情况非常罕见且有些脆弱,尽管在示例中会使用它来清楚地演示特定搜索组件的效果。
默认组件
如下所示,我们所看到的搜索体验主要是下面定义的一系列组件。它们按列出的顺序调用。
组件名称 | 类名 | 更多信息 |
---|---|---|
query |
|
在 查询语法和解析器 部分中描述。 |
facet |
|
在 Faceting 部分中描述的原始基于参数的 facet 组件。 |
facet_module |
|
在 JSON Facet API 部分中描述的 JSON Faceting 和分析模块。 |
mlt |
|
在 MoreLikeThis 部分中描述。 |
highlight |
|
在 高亮显示 部分中描述。 |
stats |
|
在 统计组件 部分中描述。 |
expand |
|
在 折叠和展开结果 部分中描述。 |
terms |
|
在 Terms 组件 部分中描述。 |
debug |
|
在 debug 参数 部分中描述。 |
随附的自定义组件
除了默认组件外,Solr 还随附了许多附加的非常有用的组件。它们需要在 solrconfig.xml
中定义和引用才能实际使用。
-
AnalyticsComponent
,在 分析组件 部分中描述(已弃用)。 -
ClusteringComponent
,在 结果聚类 部分中描述。 -
PhrasesIdentificationComponent
,用于基于索引字段中的 shingles 识别和评分输入字符串中找到的“短语”,在 PhrasesIdentificationComponent javadocs 中描述。 -
QueryElevationComponent
,在 查询提升组件 部分中描述。 -
RealTimeGetComponent
,在 实时获取 部分中描述。 -
ResponseLogComponent
,用于通过 Solr 日志记录返回给用户的文档,在 ResponseLogComponent javadocs 中描述。 -
SpellCheckComponent
,在 拼写检查 部分中描述。 -
SuggestComponent
,在 建议器 部分中描述。 -
TermVectorComponent
,在 词向量组件 部分中描述。
一些第三方组件也链接自 https://solr.cool/ 网站。
定义自定义搜索组件
定义自定义组件的语法是
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.IndexBasedSpellChecker</str>
...
</lst>
</searchComponent>
自定义组件通常具有此处未描述的配置元素。有关详细信息,请查看特定组件的文档/示例。
注意:如果您使用默认名称之一注册新的搜索组件,则将使用新定义的组件而不是默认组件。这允许覆盖特定组件,而无需太担心升级 Solr。
引用搜索组件
可以将某些组件定义为在上面列出的默认组件之前(使用 first-components
)或之后(使用 last-components
)使用。
<searchComponent name="..." class="...">
<arr name="first-components">
<str>mycomponent</str>
</arr>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</searchComponent>
使用名称“debug”注册的组件将始终在“last-components”之后执行 |
如果您定义 components
而不是默认组件,则不会执行默认组件,并且不允许使用 first-components
和 last-components
。这应视为最后选择,因为默认列表可能会在以后的 Solr 版本中更改。
<searchComponent name="..." class="...">
<arr name="components">
<str>mycomponent</str>
<str>query</str>
<str>debug</str>
</arr>
</searchComponent>
更新请求处理程序
更新请求处理程序是处理索引更新的请求处理程序。大多数可用的更新请求处理程序都是隐式的,可以通过定义正确命名的参数集进行自定义。
如果您需要定义其他更新请求处理程序,语法是
<requestHandler name="/update/json" class="solr.UpdateRequestHandler">
... defaults/appends/invariants
</requestHandler>
完整详细信息在 使用更新处理程序进行索引 部分中介绍。
与搜索处理程序的搜索组件类似,Solr 具有用于更新请求处理程序的文档预处理插件,称为 更新请求处理器,它们也允许默认和自定义配置链。
注意:不要将更新请求处理程序与在 solrconfig.xml
中定义的 updateHandler
部分混淆。