2015-09-25 48 views
0

我正在用elasticsearch过滤器挣扎。我有一个company_office型,看起来像这样:Elasticsearch查询帮助 - 多个嵌套与/或

{ 
    "company_office_id": 1, 
    "is_headquarters": true, 
    "company": { 
    "name": "Some Company Inc" 
    }, 
    "attribute_values": [ 
     { 
     "attribute_id": 1, 
     "attribute_value": "attribute 1 value", 
     }, 
     { 
     "attribute_id": 2, 
     "attribute_value": "ABC", 
     }, 
     { 
     "attribute_id": 3, 
     "attribute_value": "DEF", 
     }, 
     { 
     "attribute_id": 3, 
     "attribute_value": "HIJ", 
     } 
    ] 
} 

让我们假设ATTRIBUTE_VALUE是not_analyzed - 这样我就可以完全匹配就可以了。

现在我想过滤多个attribute_id和值字段的组合。事情是这样的SQL:

SELECT * 
FROM CompanyOffice c 
JOIN Attributes a --omitting the ON here, just assume the join is valid 
WHERE 
c.is_headquarters = true AND 
(
    (a.attribute_id=2 AND a.attribute_value IN ('ABC')) OR 
    (a.attribute_id=3 AND a.attribute_value IN ('DEF','HIJ')) 
) 

所以我需要在特定字段+ ID /值的多种组合进行筛选。

这里是我试过的查询:

{ 
    "query" : { 
    "filtered" : { 
     "filter" : { 
     "bool" : { 
      "must" : [ 


      { "term": {"is_headquarters": true } }, 
      {"bool": { 
         "must":[ 
         {"term": {"attribute_values.attribute_id": 1}}, 
         {"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}} 
         ] 
        }}   
      ] 
     } 
     } 
    } 
    } 
} 

该查询返回的结果,即使在company_office不具有1 /“HIJ”任何ID /值对。在这里,我的想法是,因为这个布尔滤波器坐在父must段里面,那么所有项目必须是真实的:

  {"bool": { 
         "must":[ 
         {"term": {"attribute_values.attribute_id": 1}}, 
         {"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}} 
         ] 
        }} 

为什么这个查询返回的结果给出的问题的开始提供的数据样本?有没有不同的方式来编写过滤器,并完成我想要做的事情?

非常感谢您的帮助!

回答

2

如果您想查询更深入的对象,而他们的扁平化结构,需要设置

"type": "nested" 

"attribute_values"财产。

然后请参考如何编写​​,并且您应该正确地检索整个文档。使用inner hits来检索匹配的attribute_values

默认情况下,Elasticsearch在索引时不嵌套属性。所有子字段被压缩到单独的子字段中,无法通过其实际结构查询它们。您不会看到这种效果,因为原始文档已返回。

除此之外,您的查询是有点关闭。在最后的"should"声明中,您只有1个词条过滤器,因此它实际上是"must"部分,但它们必须重写为嵌套格式。

+0

好棒。我再也不能再尝试这几天了,一旦我回来了,我会回来评论答案。谢谢您的帮助!! – MattW

+0

添加嵌套的映射结束了伎俩。再次感谢! – MattW