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