【问题标题】:ElasticSearch Nested Query Does not work as expectedElasticSearch 嵌套查询无法按预期工作
【发布时间】:2018-10-13 08:42:42
【问题描述】:

我需要快速帮助,只有当我在同一个数组中满足某些条件时,我才需要获取整个文档。

示例

在一个数组块中所有这三个条件都满足时的条件。即

  • “profile.bud.buddies.code”:“1”
  • "profile.bud.buddies.moredata.key":"one"
  • “profile.bud.buddies.moredata.val”:“0”

不幸的是,现在它正在遍历整个文档并尝试匹配每个数组中的值,因此可能会在一个数组中匹配 code=1,在另一个数组中匹配 key=one,而在其他数组中匹配 val=0在第三个数组中。在这种情况下会发生什么,它会将整个文档返回给我,而实际上这并没有在一个数组中完成,因此不应该将文档返回给我。

我将 moredata 设为嵌套类型,但仍然无法通过。请帮忙。

我正在使用的查询

"query": {
    "bool": {
      "should": [
        {
          "match": {
            "profile.bud.buddies.code": "1"
          }
        }
      ]
    },
    "nested": {
    "path": "profile.bud.buddies.moredata",
    "query": {
      "bool": {
        "must": [
          {
            "match": {
              "profile.bud.buddies.moredata.key": "one"
            }
          },
          {
            "match": {
              "profile.bud.buddies.moredata.val": "0"
            }
          }
        ]
      }
    }
  }
}

文档结构

"profile": {
  "x":{},
  "y":{},
  "a":{},
  "b":{},
  "bud":{
    "buddies": [
    {
        "code":"1",
        "moredata": [
            {
                "key": "one",
                "val": 0,
                "setup": "2323",
                "data": "myid"
            },
            {
                "key": "two",
                "val": 1,
                "setup": "23",
                "data": "id"
            }]
    },
    {
        "code":"2",
        "moredata": [
            {
                "key": "two",
                "val": 0,
                "setup": "2323",
                "data": "myid"
            },
            {
                "key": "three",
                "val": 1,
                "setup": "23",
                "data": "id"
            }]
    }]
}

这就是我标记映射的方式;

"profile": {
"bug": {
                                "properties": {
                                    "buddies": {
                                        "properties": {
                                            "moredata": {
                                                "type": "nested",
                                                "properties": {
                            "key": {"type": "string"},
                            "val": {"type": "string"}

【问题讨论】:

    标签: elasticsearch nested nest elasticsearch-plugin elasticsearch-5


    【解决方案1】:

    你的查询结构不正确,应该是这样的

    "query": {
      "bool": {
        "must": [{
            "match": {
              "profile.bud.buddies.code": "1"
            }
          },
          {
            "nested": {
              "path": "profile.bud.buddies.moredata",
              "query": {
                "bool": {
                  "must": [{
                      "match": {
                        "profile.bud.buddies.moredata.key": "one"
                      }
                    },
                    {
                      "match": {
                        "profile.bud.buddies.moredata.val": "0"
                      }
                    }
                  ]
                }
              }
            }
            ]
        }
      }
    }
    

    其中nested 查询位于外部bool 查询的must 子句数组的内部。请注意,profile.bud.buddies.moredata 必须映射为 nested 数据类型。

    【讨论】:

    • 谢谢 - 在位置 660 的 JSON 中出现以下错误 Unexpected token ]
    • 对问题进行了排序,只需将 ] 下移一级即可。
    • 所有查询都是should子句,所以只需要匹配一个即可。我认为它们应该是mustfilter 子句?
    • 没有得到你
    • 在您的问题描述中,您说需要满足所有条件。如果查询位于bool 查询的should 子句中,则只需匹配一个查询即可在响应中返回文档。如果需要满足所有查询,则查询应位于bool 查询的must 子句或filter 子句中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2019-05-24
    • 2019-10-24
    • 1970-01-01
    • 2016-11-01
    • 2015-02-20
    相关资源
    最近更新 更多