Elasticsearch 查询按条件按特定字段值过滤文档

Elasticsearch query to filter document by specific field value with conditions

如果提供,我想过滤品牌名称,但如果过滤器为空,return所有品牌。 这是我的查询。

"query": {
    "bool": {
        "must": [
            {
                "terms": {
                    "seller": [
                        "Seller1",
                        "Seller2"
                    ]
                }
            },
            {
                "bool": {
                    "should": [
                        {
                            "terms": {
                                "brand": [
                                    "brand1"
                                ]
                            }
                        },
                        {
                            "bool": {
                                "must_not": [
                                    {
                                        "term": {
                                            "brand": {
                                                "value": ""
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            },
            {
                "nested": {
                    "path": "Stock",
                    "query": {
                        "bool": {
                            "must": {
                                "match": {
                                    "region": "Regional"
                                }
                            },
                            "filter": [
                                {
                                    "term": {
                                        "pincode": "12345"
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        ]
    }
}

我只想要 if (brand == ["brand1","brand2"]) return 那些品牌产品。但是如果提供空 return 全部。我尝试将它与 should 一起使用,如果提供了品牌,仍然可以获得所有东西。

有多种方式,下面提到了一些:

选项 1:

您可以在创建查询时在应用程序级别处理这种包含、排除的逻辑。如果您使用 Java 或 python 客户端,那么它很容易实现。如果你调用elasticsearch的直接搜索API那么你不能在调用api.

时添加brand term clause

选项 2:

您可以使用 Elasticsearch 的 search template 功能。

首先您需要创建搜索模板,如下例所示:

PUT _scripts/my-search-template
{
  "script": {
    "lang": "mustache",
    "source": """{
     "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "seller": [
              "seller1",
              "seller2"
            ]
          }
        }
      ],
      "filter": [
          {{#filter}}
          {
            "terms": {
              "{{name}}": 
                {{#toJson}}value{{/toJson}}
            }
          }{{/filter}}
      ]
    }
  }
    }"""
  }
}

您可以使用下面的 API 来使用搜索模板进行搜索,这里如果您不在过滤器中传递 brand 它不会在实际查询中添加:

POST querycheck/_search/template
{
  "id": "my-search-template",
  "params": {
    "filter": [
      {
        "name": "brand",
        "value": [
          "brand1",
          "brand2"
        ]
      }
    ]
  }
}

您也可以使用 render api 检查查询模板生成的查询是否正确。

POST _render/template
{
  "id": "my-search-template",
  "params": {
    "filter": [
      {
        "name": "brand",
        "value": [
          "brand1",
          "brand2"
        ]
      }
    ]
  }
}