【问题标题】:Elasticsearch: don't return document if any of nested object field matches term valueElasticsearch:如果任何嵌套对象字段与术语值匹配,则不返回文档
【发布时间】:2020-04-29 14:26:20
【问题描述】:

如果它的任何嵌套对象字段值与查询中传递的术语值匹配,则我很难编写不应返回文档的查询。

文档样本:

 {
      "id": 1,
      "test": "name",
      "rules": [
        {
          "id": 2,
          "name": "rule3",
          "questionDetailConditionalRules": [
            {
              "questionDetailId": 1
            },
            {
              "questionDetailId": 2
            }
          ]
        },
        {
          "id": 3,
          "name": "rule3",
          "questionDetailConditionalRules": [
            {
              "questionDetailId": 4
            },
            {
              "questionDetailId": 5
            }
          ]
        }
      ]
    }

rule 字段具有嵌套类型

我的嵌套搜索查询是:

{
  "query": {
    "nested": {
      "path": "rules",
      "query": {
        "bool": {
          "must_not": [
            {
              "terms": {
                "rules.questionDetailConditionalRules.questionDetailId": [
                  1
                ]
              }
            }
          ]
        }
      }
    }
  }
}

预期结果:文档不应返回 实际结果:返回文档。

我应该错过查询中的任何内容吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

    能够重现您的问题并修复它,请找到逐步解决方案以使其正常工作。 您需要将nested 移动到must_not 块内并对您的查询进行一些修改。

    索引定义

    {
        "mappings" :{
            "properties" :{
                "rules" :{
                    "type" : "nested"
                }
            }
        }
    }
    

    为您的示例文档编制索引

    {
        "rules": [
            {
                "id": 2,
                "name": "rule3",
                "questionDetailConditionalRules": [
                    {
                        "questionDetailId": 1
                    },
                    {
                        "questionDetailId": 2
                    }
                ]
            },
            {
                "id": 3,
                "name": "rule3",
                "questionDetailConditionalRules": [
                    {
                        "questionDetailId": 4
                    },
                    {
                        "questionDetailId": 5
                    }
                ]
            }
        ]
    }
    

    搜索查询

    {
        "query": {
            "bool": {
                "must_not": [
                    {
                        "nested": {
                            "path": "rules",  --> note `nested` is inside the `must_not` block.
                            "query": {
                                "bool": {
                                    "filter": [
                                        {
                                            "term": {
                                                "rules.questionDetailConditionalRules.questionDetailId": 1
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
    

    搜索结果

    "hits": {
            "total": {
                "value": 0,
                "relation": "eq"
            },
            "max_score": null,
            "hits": []
        }
    

    注意:您可以在this 链接中找到更多信息。

    【讨论】:

    • 非常感谢。这就是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多