Elasticsearch嵌套过滤器查询

时间:2015-06-09 00:15:59

标签: elasticsearch

以下是我尝试创建查询的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,类和嵌套参数上搜索的筛选查询?例如。在伪代码中,我会有一个" bool" "必须"在sku和class上,然后是一个"嵌套" "过滤器" "布尔" "必须"在构成文档的每个参数上。在https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html我可以看到如何使用嵌套在文档上,其中每个嵌套字段都是唯一的字段名称,但在我的文档中,每个数组元素都有" name"和"价值"。

似乎这应该很简单。

1 个答案:

答案 0 :(得分:3)

应该这样做(例如):

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

相关问题