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

}

}

}

]

}

}

}


回答:

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

以上是 es搜索匹配数据内元素属性 的全部内容, 来源链接: utcz.com/p/944359.html

回到顶部