在第三章我们介绍了嵌套类型。由于嵌套对象被索引在独立隐藏的文档中,我们无法直接查询它们。 相应地,我们必须使用 nested查询 去获取它们。
创建一个索引department
,它的employees
字段是nested类型:
PUT /department
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"employees": {
"type": "nested"
}
}
}
}
往里面插入两条文档:
PUT /department/_doc/1
{
"name": "Development",
"employees": [
{
"name": "Eric Green",
"age": 39,
"gender": "M",
"position": "Big Data Specialist"
},
{
"name": "James Taylor",
"age": 27,
"gender": "M",
"position": "Software Developer"
},
{
"name": "Gary Jenkins",
"age": 21,
"gender": "M",
"position": "Intern"
},
{
"name": "Julie Powell",
"age": 26,
"gender": "F",
"position": "Intern"
},
{
"name": "Benjamin Smith",
"age": 46,
"gender": "M",
"position": "Senior Software Engineer"
}
]
}
PUT /department/_doc/2
{
"name": "HR & Marketing",
"employees": [
{
"name": "Patricia Lewis",
"age": 42,
"gender": "F",
"position": "Senior Marketing Manager"
},
{
"name": "Maria Anderson",
"age": 56,
"gender": "F",
"position": "Head of HR"
},
{
"name": "Margaret Harris",
"age": 19,
"gender": "F",
"position": "Intern"
},
{
"name": "Ryan Nelson",
"age": 31,
"gender": "M",
"position": "Marketing Manager"
},
{
"name": "Kathy Williams",
"age": 49,
"gender": "F",
"position": "Senior Marketing Manager"
},
{
"name": "Jacqueline Hill",
"age": 28,
"gender": "F",
"position": "Junior Marketing Manager"
},
{
"name": "Donald Morris",
"age": 39,
"gender": "M",
"position": "SEO Specialist"
},
{
"name": "Evelyn Henderson",
"age": 24,
"gender": "F",
"position": "Intern"
},
{
"name": "Earl Moore",
"age": 21,
"gender": "M",
"position": "Junior SEO Specialist"
},
{
"name": "Phillip Sanchez",
"age": 35,
"gender": "M",
"position": "SEM Specialist"
}
]
}
假设我们想查出position == Intern && gender == F
的记录,如果使用bool查询,发现查不出结果:
GET department/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"employees.position": "intern"
}
},
{
"term": {
"employees.gender.keyword": {
"value": "F"
}
}
}
]
}
}
}
但索引里面确实存在满足条件的记录。这是因为必须使用nested
查询:
GET department/_search
{
"query": {
"nested": {
"path": "employees",
"query": {
"bool": {
"must": [
{
"match": {
"employees.position": "intern"
}
},
{
"term": {
"employees.gender.keyword": {
"value": "F"
}
}
}
]
}
}
}
}
}
从返回结果中我们看到查出来position == Intern && gender == F
的记录:
参考: https://www.elastic.co/guide/cn/elasticsearch/guide/current/nested-query.html