过滤查询处理器

过滤查询处理器(filter query processor) #

版本引入:1.14.0

filter_query 搜索请求处理器用于拦截搜索请求,并向该请求中添加一个额外的查询条件,从而对搜索结果进行过滤。当你不希望重写应用程序中已有的查询语句,但又需要对结果进行额外过滤时,此功能非常有用。

请求体字段 #

下表列出了所有可用的请求字段。

字段数据类型说明
query对象使用 Easysearch 查询领域特定语言(DSL)编写的查询语句。必填
tag字符串处理器的唯一标识符。可选。
description字符串对该处理器的描述信息。可选。
ignore_failure布尔值若为 true,则当此处理器执行失败时,Easysearch 将忽略该错误并继续执行搜索管道中的其余处理器。可选,默认值为 false

示例 #

以下示例演示如何在搜索管道中使用 filter_query 处理器。

准备工作 #

创建一个名为 my_index 的索引,并索引两个文档:一个公开,一个私有:

POST /my_index/_doc/1
{
  "message": "This is a public message",
  "visibility": "public"
}
POST /my_index/_doc/2
{
  "message": "This is a private message",
  "visibility": "private"
}

创建搜索管道 #

以下请求创建一个名为 my_pipeline 的搜索管道,其中包含一个 filter_query 请求处理器。该处理器使用 term 查询,仅返回可见性为“public”的文档:

PUT /_search/pipeline/my_pipeline
{
  "request_processors": [
    {
      "filter_query": {
        "tag": "tag1",
        "description": "此处理器将限制只返回可见性为公开的文档",
        "query": {
          "term": {
            "visibility": "public"
          }
        }
      }
    }
  ]
}

使用搜索管道 #

在不使用搜索管道的情况下,对 my_index 索引执行搜索:

GET /my_index/_search

响应结果包含两个文档:

响应
{
  "took": 47,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "my_index",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "message": "This is a public message",
          "visibility": "public"
        }
      },
      {
        "_index": "my_index",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "message": "This is a private message",
          "visibility": "private"
        }
      }
    ]
  }
}

要使用搜索管道,请在请求中通过 search_pipeline 查询参数指定管道名称:

GET /my_index/_search?search_pipeline=my_pipeline

此时响应仅包含 visibilitypublic 的文档:

响应
{
  "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": "This is a public message",
          "visibility": "public"
        }
      }
    ]
  }
}