es搜索匹配数据内元素属性

请问es搜索,针对记录中带有数组,且查询条件需要满足同一数组元素中的两个字段需要怎么查。

这是被查询数据

{        
    "_index": "group",
    "_type": "doc",
    "_id": "NzhrHYABz02YlkI8VQjI",
    "_score": 1,
    "_source": {
      "groupid": 100000000,
      "groupname": "xxxxxxxxxxx",
      "groupmembers": [
        {
          "userid": 1000,
          "name": "小明"
        },
        {
          "userid": 1001,
          "name": "小张"
        },
        {
          "userid": 1002,
          "name": "小李"
        }
    }
}

这是查询语句,我希望同时某个数组中元素同时满足userid和name都匹配才能被查到,但是下面的语句非同时满足也能查到

GET group/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "groupmembers.purename": {
              "value": "小明"
            }
          }
        },
        {
          "term": {
            "groupmembers.userid": {
              "value": 1001
            }
          }
        }
      ]
    }
  }
}
阅读 2.3k
1 个回答

ES 里数组里嵌套的结构会被打平,上面的 doc 其实会变成

"groupmembers.userid": [1000,1001,1002],
"groupmembers.name": ["小明", "小张","小李"]

所以,并不能匹配完整的元素。

想完整匹配,得把groupmembers 的类型从 object 改成 nested ,然后用 nested query 。


设置更改类型:(index 里有文档之后可能就改不了。得用一个新建的 index 设置)

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "groupmembers": {
        "type": "nested" 
      }
    }
  }
}

Query:

GET my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "groupmembers",
      "query": {
        "bool": {
          "must": [
            { "match": { "groupmembers.userid": 1001 }},
            { "match": { "groupmembers.name":  "小明" }} 
          ]
        }
      }
    }
  }
}

上面的 query 是从文档页直接改的,不保证直接可用。


文档见 Nested field type

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题