2015-06-09 183 views
1

这里是我试图创建一个查询针对我的json文档的一个例子。 “params”字段映射为“嵌套”。Elasticsearch嵌套过滤器查询

{ 
    "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和class上有一个“bool”“must”,然后在组成文档的每个参数上都有一个“嵌套”“过滤器”“bool”“必须”。在https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html我可以看到如何使用嵌套在每个嵌套字段是唯一的字段名称的文档上,但在我的文档中每个数组元素具有“名称”和“值”。

看起来像这样应该很简单。

回答

2

这应该这样做(例如):

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过滤子句每个嵌套的文档(我只包括两项,但你可以有许多如你所愿);如果我们在单个nested子句中使用bool,并且内部bool中有一堆过滤器,ES会尝试查找与所有提供的过滤器匹配的单个嵌套文档。这样我们告诉ES,nested过滤器不必全都适用于相同的嵌套文档。

这是我用来测试它的代码:

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

+0

斯隆,感谢您的回答。请问您是否更新了有关“...找到匹配所有提供的过滤器的单个嵌套文档”的答案?这就是我想要做的。当我运行我的查询时,包括params.name和params.value的所有嵌套参数都必须匹配。嵌套参数对于单个文档始终是唯一的。现在分隔的嵌套参数查询会这样做吗?看起来好像它会,但是你的评论谈论一个嵌套子句中的bool,你的示例查询没有使用这个子句。无论如何谢谢,请澄清。 – Zelf

+0

您发布的文档具有名称 - 值对列表;每个名称 - 值对都位于单独的子文档中。我发布的查询将返回一个父文档,其中包含一个包含名称“item1'”的子文档和另一个包含名称“item3”'的子文档。鉴于您发布的文档,我发布的查询是有意义的,并且会返回您发布的文档。单个嵌套文档无法匹配两个嵌套过滤器,因为它只能有一个名称。合理? –

+0

谢谢。我现在知道了。完美的作品。 – Zelf

相关问题