搜索管道 #
您可以使用搜索管道构建新的或重用现有的结果重排器、查询重写器以及其他对查询或结果进行操作的组件。搜索管道使您能够更轻松地在 Easysearch 中处理搜索查询和搜索结果。 将部分应用程序功能迁移到 Easysearch 搜索管道中可以降低应用程序的整体复杂性。作为搜索管道的一部分,您可以指定执行模块化任务的处理器列表。 然后,您可以轻松添加或重新排序这些处理器,以自定义应用程序的搜索结果。
名词解释 #
以下是与搜索管道相关的术语列表:
- 搜索请求处理器(Search request processor):用于拦截搜索请求(包含查询语句及请求中传递的元数据),对搜索请求执行相关操作后返回处理结果的组件。
- 搜索响应处理器(Search response processor):用于拦截搜索响应及搜索请求(包含查询语句、返回结果及请求中传递的元数据),对搜索响应执行相关操作后返回处理结果的组件。
- 搜索阶段结果处理器(Search phase results processor):在协调节点层面运行于搜索阶段之间的组件。该处理器会截获从一个搜索阶段返回的结果,经转换处理后传递至下一个搜索阶段。
- 处理器(Processor):泛指搜索请求处理器或搜索响应处理器。
- 搜索管道(Search pipeline):在 Easysearch 中集成的一个有序处理器列表。该管道会拦截查询,先对查询进行处理,再将其发往 Easysearch;随后拦截返回的结果,对结果进行处理,最后将结果返回给调用方,如下图所示。
创建搜索管道 #
搜索管道存储在集群状态中。要创建搜索管道,您必须在 Easysearch 集群中配置一个有序的处理器列表。管道中可以包含多个相同类型的处理器。每个处理器都有一个 tag
(标签)标识符,用于将其与其他处理器区分开来。当调试错误信息时,为特定处理器设置标签非常有用,尤其是在添加了多个相同类型的处理器时。
示例请求 #
以下请求创建一个名为 my_pipeline
的搜索管道,其中包含一个 filter_query
请求处理器和一个响应处理器:
- 请求处理器使用 term 查询,仅返回可见性为“public”(公开)的消息;
- 响应处理器将字段
message
重命名为notification
。
PUT /_search/pipeline/my_pipeline
{
"request_processors": [
{
"filter_query": {
"tag": "tag1",
"description": "此处理器将限制只返回公开可见的文档",
"query": {
"term": {
"visibility": "public"
}
}
}
}
],
"response_processors": [
{
"rename_field": {
"field": "message",
"target_field": "notification"
}
}
]
}
忽略处理器失败 #
默认情况下,如果搜索管道中的某个处理器执行失败,整个管道将停止运行。如果您希望在某个处理器失败时管道仍继续执行后续处理器,可以在创建管道时将该处理器的 ignore_failure
参数设置为 true
:
"filter_query" : {
"tag" : "tag1",
"description" : "This processor is going to restrict to publicly visible documents",
"ignore_failure": true,
"query" : {
"term": {
"visibility": "public"
}
}
}
当设置了 ignore_failure: true
后,如果该处理器执行失败,Easysearch 会记录失败日志,并继续执行搜索管道中剩余的其他处理器。
更新搜索管道 #
要动态更新搜索管道,可以通过 Search Pipeline API 重新替换该管道的配置。
示例请求 #
以下示例请求通过添加一个 filter_query
请求处理器和一个 rename_field
响应处理器,对 my_pipeline
进行 upsert(存在则更新,不存在则创建)操作:
PUT /_search/pipeline/my_pipeline
{
"request_processors": [
{
"filter_query": {
"tag": "tag1",
"description": "此处理器仅返回公开可见的文档",
"query": {
"term": {
"visibility": "public"
}
}
}
}
],
"response_processors": [
{
"rename_field": {
"field": "message",
"target_field": "notification"
}
}
]
}
⚠️ 注意:更新操作会完全覆盖原有管道配置,因此请确保在请求体中包含更新后所需的全部处理器。
使用搜索管道 #
有2种方式使用搜索管道:
- 为请求指定一个已存在的搜索管道。
- 为索引中的所有请求设置一个 默认搜索管道。
为请求指定一个已存在的搜索管道 #
在你
创建搜索管道之后,可以通过在查询中指定 search_pipeline
查询参数来使用该管道:
GET /my_index/_search?search_pipeline=my_pipeline
默认搜索管道 #
为了方便起见,你可以为某个索引设置一个默认的搜索管道。一旦设置了默认管道,就无需在每次搜索请求中显式指定 search_pipeline
参数。
为索引设置默认搜索管道 #
要为索引设置默认搜索管道,可以在索引设置中指定 index.search.default_pipeline
:
PUT /my_index/_settings
{
"index.search.default_pipeline": "my_pipeline"
}
为 my_index
设置默认管道后,你可以执行一个简单的全文搜索请求:
GET /my_index/_search
响应中仅包含公开文档,说明默认管道已自动应用:
响应
{
"took": 19,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "my_index",
"_id": "1",
"_score": 0.0,
"_source": {
"message": "这是一个公开消息",
"visibility": "public"
}
}
]
}
}
在请求中禁用默认管道 #
如果你希望执行一个不应用默认管道的搜索请求,可以将 search_pipeline
查询参数设置为 _none
:
GET /my_index/_search?search_pipeline=_none
移除默认管道 #
要从索引中移除默认管道,可将其设置为 null
或 _none
:
PUT /my_index/_settings
{
"index.search.default_pipeline": null
}
PUT /my_index/_settings
{
"index.search.default_pipeline": "_none"
}
删除搜索管道 #
要删除特定搜索管道,请将管道 ID 作为参数传递:
DELETE /_search/pipeline/<pipeline-id>
要删除集群中的所有搜索管道,请使用通配符 ( * ):
DELETE /_search/pipeline/*
检索搜索管道 #
要查看所有搜索管道,可发送以下请求:
GET /_search/pipeline
响应内容包含你在上一节中创建的管道:
响应
{
"my_pipeline": {
"request_processors": [
{
"filter_query": {
"tag": "tag1",
"description": "该处理器将限制只返回公开可见的文档",
"query": {
"term": {
"visibility": "public"
}
}
}
}
]
}
}
要查看某个特定的管道,可在路径中指定管道名称作为参数:
GET /_search/pipeline/my_pipeline
你也可以使用通配符模式来查看部分管道,例如:
GET /_search/pipeline/my*
这将返回所有以 my
开头的搜索管道。