搜索管道

搜索管道 #

您可以使用搜索管道构建新的或重用现有的结果重排器、查询重写器以及其他对查询或结果进行操作的组件。搜索管道使您能够更轻松地在 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 开头的搜索管道。