搜索管道

搜索管道 #

您可以使用搜索管道构建新的或重用现有的结果重排器、查询重写器以及其他对查询或结果进行操作的组件。搜索管道使您能够更轻松地在 Easysearch 中处理搜索查询和搜索结果。 将部分应用程序功能迁移到 Easysearch 搜索管道中可以降低应用程序的整体复杂性。作为搜索管道的一部分,您可以指定执行模块化任务的处理器列表。 然后,您可以轻松添加或重新排序这些处理器,以自定义应用程序的搜索结果。

名词解释 #

以下是与搜索管道相关的术语说明:

名词名称定义说明
查询重写处理器用于拦截搜索请求(包含查询语句及请求中传递的元数据),在查询执行之前对原始查询进行重写和增强。
结果增强处理器用于拦截搜索响应及搜索请求(包含查询语句、返回结果及请求中传递的元数据),对搜索响应执行相关操作后返回处理结果的组件。
重排序处理器在协调节点层面运行于搜索阶段之间的组件。该处理器会对初步合并的搜索结果进行重新排序,提升相关性。
处理器(Processor)泛指查询重写处理器或结果增强处理器。
搜索管道(Pipeline)在 Easysearch 中集成的一个有序处理器列表。该管道会拦截查询,先对查询进行处理,再将其发往 Easysearch;随后拦截返回的结果,对结果进行处理,最后将结果返回给调用方。

创建搜索管道 #

搜索管道存储在集群状态中。要创建搜索管道,您必须在 Easysearch 集群中配置一个有序的处理器列表。管道中可以包含多个相同类型的处理器。每个处理器都有一个 tag(标签)标识符,用于将其与其他处理器区分开来。当调试错误信息时,为特定处理器设置标签非常有用,尤其是在添加了多个相同类型的处理器时。

API 说明 #

请求语法 #

PUT /_search/pipeline/

路径参数 #
参数类型是否必填说明
pipeline-id字符串搜索管道的唯一标识符。命名规则:
• 仅允许小写字母、数字、连字符(-)、下划线(_
• 不能以 _ 开头
• 长度建议不超过 255 字符
请求体参数 #

请求体是一个 JSON 对象,包含一个或多个处理器列表。所有字段均为可选,但至少需提供 rewrite_processorsenrich_processors 中的一个。

字段类型说明
rewrite_processors数组查询重写处理器列表。在查询执行前对搜索请求进行修改(如添加过滤条件、重写查询结构等)。
enrich_processors数组结果增强处理器列表。在搜索响应返回前对结果进行处理(如重命名字段、添加元数据等)。
rerank_processors数组重排序处理器列表。在协调节点上对初步合并的搜索结果进行二次排序(如融合关键词与向量搜索结果)。

💡 注意

  • 处理器按数组顺序依次执行。
  • 同一类型处理器可重复添加(建议使用 tag 区分)。
  • 若请求体为空 {},将创建一个空管道(无实际作用)。

示例请求 #

以下请求创建一个名为 my_pipeline 的搜索管道,其中包含一个 filter_query 查询重写处理器和一个结果增强处理器:

  • 查询重写处理器使用 term 查询,仅返回可见性为“public”(公开)的消息;
  • 结果增强处理器将字段 message 重命名为 notification
PUT /_search/pipeline/my_pipeline
{
  "rewrite_processors": [
    {
      "filter_query": {
        "tag": "tag1",
        "description": "此处理器将限制只返回公开可见的文档",
        "query": {
          "term": {
            "visibility": "public"
          }
        }
      }
    }
  ],
  "enrich_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
{
  "rewrite_processors": [
    {
      "filter_query": {
        "tag": "tag1",
        "description": "此处理器仅返回公开可见的文档",
        "query": {
          "term": {
            "visibility": "public"
          }
        }
      }
    }
  ],
  "enrich_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": {
    "rewrite_processors": [
      {
        "filter_query": {
          "tag": "tag1",
          "description": "该处理器将限制只返回公开可见的文档",
          "query": {
            "term": {
              "visibility": "public"
            }
          }
        }
      }
    ]
  }
}

要查看某个特定的管道,可在路径中指定管道名称作为参数:

GET /_search/pipeline/my_pipeline

你也可以使用通配符模式来查看部分管道,例如:

GET /_search/pipeline/my*

这将返回所有以 my 开头的搜索管道。