【问题标题】:Elasticsearch: Find all parents where all children have a property with a specific valueElasticsearch:查找所有孩子都具有特定值的属性的所有父母
【发布时间】:2018-10-26 22:23:37
【问题描述】:

我有当前架构:

  • 对象parent 具有属性date 和n 个孩子child
  • 对象child 包含单个属性foo

我想检索所有parent,其中所有 child 的属性foo 等于0

我尝试了不同的方法,但无论我做什么,一些parent 被检索,而一个child1 拥有foo 属性

我的查询示例:

{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "date": {
                            "lt": "2018-07-05T10:00:00.000Z"
                        }
                    }               
                },
                {
                    "nested": {
                        "path": "child",
                        "query": {
                            "bool": {
                                "must": {
                                    "term": {
                                        "child.foo": 0
                                    }       
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

我试过shouldmatchrange...甚至must_not/should_not。我也尝试过过滤,但没有任何运气,我一直在1foo 属性上获得点击。

我也尝试了聚合路径,但我不明白如何将其应用于我的需要。

编辑:我查看了可能的重复项。虽然它没有回答我的问题,但它让我走上了正轨。我的问题是我以 SQL 方式思考,使用连接等。虽然我应该以弹性的方式思考。

因此,我想做的事情无法完成。我需要寻找parent,其中至少有一个childfoo 属性为1 或更多。然后,忽略这些结果并采取其他结果。因此答案很简单:我只需添加以将嵌套查询的must 更改为must_not,就是这样!

【问题讨论】:

  • 基本上must(嵌套所有(must))= must_not(嵌套至少一个(must_not))。
  • 感谢您的意见。虽然在我的情况下语法不同(not 不存在),但我通过不同的思考找到了解决方案。
  • 我不确定我是否理解 - 我从来没有提到过not,只有must_not :) 无论如何,很高兴你有一个解决方案。考虑将其张贴在这里以供后代使用。
  • 我说的是你提供的链接^^无论如何感谢你我走上了正确的轨道。

标签: elasticsearch search


【解决方案1】:

正如我在问题编辑中解释的那样,一旦您开始以正确的方式思考,答案就相当容易了。/

{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "date": {
                            "lt": "2018-07-05T10:00:00.000Z"
                        }
                    }               
                },
                {
                    "nested": {
                        "path": "child",
                        "query": {
                            "bool": {
                                "must_not": {
                                    "term": {
                                        "child.foo": 0
                                    }       
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

诀窍就是设置一个must_not

【讨论】:

  • 如何使用 NEST fluent API 创建此映射:child.foo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多