簡體   English   中英

Elasticsearch 查詢按特定字段值和條件過濾文檔

[英]Elasticsearch query to filter document by specific field value with conditions

如果提供,我想過濾品牌名稱,但如果過濾器為空,則返回所有品牌。 這是我的查詢。

"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"]) 只退回那些品牌產品。 但如果提供的是空的,則全部返回。 我嘗試將它與 should 一起使用,如果提供了品牌,仍然可以得到所有東西。

有多種方法,下面提到了一些方法:

選項1:

您可以在創建查詢時在應用程序級別處理這種包含、排除的邏輯。 如果您使用的是 Java 或 python 客戶端,則很容易實現。 如果您撥打elasticsearch直接搜索API,則撥打api時不能添加brand term clause

選項 2:

您可以使用 Elasticsearch 的搜索模板功能。

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

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"
        ]
      }
    ]
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM