簡體   English   中英

Elasticsearch嵌套過濾器查詢

[英]Elasticsearch nested filter query

這是我正在嘗試創建查詢的json文檔的示例。 “params”字段被映射為“嵌套”。

{
   "images": [
      {
         "name": "1907183375555f7c44126f23.67610475.png"
      },
      {
         "name": "5693836375575c567764bc2.87695507.png"
      }
   ],
   "sku": "MYSKU",
   "class": "some_class",
   "params": [
      {
         "name": "item1",
         "value": "item1value"
      },
      {
         "name": "item2",
         "value": "item2value"
      },
      {
         "name": "item3",
         "value": "item3value"
      },
      {
         "name": "item4",
         "value": "item4value"
      },
      {
         "name": "item5",
         "value": "item5value"
      }
   ]
}

如何創建將在sku,類和嵌套參數上搜索的篩選查詢? 例如,在偽代碼中,我會在sku和類上有一個“bool”“must”,然后在構成文檔的每個參數上都有一個“嵌套”“過濾器”“bool”“必須”。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html我可以看到如何使用嵌套在文檔上,其中每個嵌套字段都是唯一的字段名稱,但在我的文檔中,每個數組元素都有“name”和“value”。

看起來這應該很簡單。

這應該做(例如):

POST /test_index/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "bool": {
               "must": [
                  {
                     "term": {
                        "class": "some_class"
                     }
                  },
                  {
                     "term": {
                        "sku": "MYSKU1"
                     }
                  },
                  {
                     "nested": {
                        "path": "params",
                        "filter": {
                           "term": {
                              "params.name": "item1"
                           }
                        }
                     }
                  },
                  {
                     "nested": {
                        "path": "params",
                        "filter": {
                           "term": {
                              "params.name": "item3"
                           }
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}

請注意,您希望匹配的每個嵌套文檔都有單獨的nested過濾器子句(我只包含兩個,但您可以包含任意數量); 相反,如果我們使用了bool單內nested條款,帶着一幫的內內過濾器bool ,ES將設法找到符合所有提供的過濾器一個嵌套的文檔。 這樣我們告訴ES nested過濾器不必全部應用於同一嵌套文檔。

這是我用來測試它的代碼:

http://sense.qbox.io/gist/26552d6a8a285c7715b0ac4feab08bd283971664

暫無
暫無

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

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