【问题标题】:Elasticsearch Query Help - Multiple Nested AND/ORElasticsearch 查询帮助 - 多重嵌套 AND/OR
【发布时间】:2015-09-26 16:49:40
【问题描述】:

我正在努力使用弹性搜索过滤器。我有一个看起来像这样的company_office 类型:

{
  "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 和value 字段的组合。在 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/value 的多个组合。

这是我尝试过的查询:

{
  "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/value 配对,此查询也会返回结果。我的想法是,因为这个 bool 过滤器位于父 must 部分内,所以所有项目都必须为真:

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

鉴于问题开头提供的数据样本,为什么该查询会返回结果?是否有不同的方式来编写过滤器并完成我想要做的事情?

非常感谢您的帮助!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果你想查询更深层次的对象而不扁平化它们的结构,你需要设置

    "type": "nested"
    

    "attribute_values" 属性上。

    然后参考nested queries in documentation的写法,你应该正确检索整个文档。使用inner hits 检索匹配的attribute_values

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

    除此之外,您的查询有点偏离。在最后一个 "should" 语句中,您只有 1 个术语过滤器,因此它实际上是 "must" 部分,但必须将它们重写为嵌套格式。

    【讨论】:

    • 好的太棒了。我不能再尝试几天了,一旦我这样做了,我会回来评论答案。感谢您的帮助!
    • 添加了嵌套映射最终起到了作用。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多