Elasticsearch查询嵌套结构
Elasticsearch Querying Nested Structure
我尝试查询具有嵌套对象的文档:
{
"name":"Adam",
"cities":[
{
"name":"California",
"activities":[
{
"name":"Hicking"
},
{
"name":"Camping"
},
{
"name":"Festival"
}
]
},
{
"name":"Miami",
"activities":[
{
"name":"Festival"
},
{
"name":"Diving"
},
{
"name":"Surfing"
}
]
}
]
}
我想根据activity检索所有城市,例如,我想检索Adam想去节日的所有城市。查询结果应该是California和Miami,如果我们搜索Adam会去哪个town hicking,查询结果应该是California。
这是应该的,但实际结果是,当我搜索 Adam 将进行 hicking 的城市时,查询结果是加利福尼亚和迈阿密!!
这是我使用的查询:
GET index/_search
{
"query":
{
"bool": {"filter": [
{"term": {
"cities.activities.name.keyword": "Hicking"
}}
]}
},"_source":["cities.name"]
}
这是搜索结果:
"_index" : "index",
"_type" : "prod",
"_id" : "1",
"_score" : 0.0,
"_source" : {
"cities" : [
{
"name" : "California"
},
{
"name" : "Miami"
}
]
}
对于这样的数据结构,如何进行正确的查询?
嵌套字段有帮助吗?
我应该重新设计数据结构吗?
您应该创建 cities
数组 nested
并发送 nested
查询以过滤 cities.activities.name
。要获得与您的查询匹配的子文档,您应该使用 inner_hits
,因为默认情况下 elasticsearch return 的整个文档和与您的过滤器不匹配的文档将在结果中继续 return。
这是一个示例查询,您应该检查结果中的 inner_hits
:
{
"_source": ["cities.name"],
"query": {
"nested": {
"path": "cities",
"query": {
"term": {
"cities.activities.name.keyword": {
"value": "Hicking"
}
}
},
"inner_hits": {
"_source": ["cities.name"]
}
}
}
}
我尝试查询具有嵌套对象的文档:
{
"name":"Adam",
"cities":[
{
"name":"California",
"activities":[
{
"name":"Hicking"
},
{
"name":"Camping"
},
{
"name":"Festival"
}
]
},
{
"name":"Miami",
"activities":[
{
"name":"Festival"
},
{
"name":"Diving"
},
{
"name":"Surfing"
}
]
}
]
}
我想根据activity检索所有城市,例如,我想检索Adam想去节日的所有城市。查询结果应该是California和Miami,如果我们搜索Adam会去哪个town hicking,查询结果应该是California。
这是应该的,但实际结果是,当我搜索 Adam 将进行 hicking 的城市时,查询结果是加利福尼亚和迈阿密!!
这是我使用的查询:
GET index/_search
{
"query":
{
"bool": {"filter": [
{"term": {
"cities.activities.name.keyword": "Hicking"
}}
]}
},"_source":["cities.name"]
}
这是搜索结果:
"_index" : "index",
"_type" : "prod",
"_id" : "1",
"_score" : 0.0,
"_source" : {
"cities" : [
{
"name" : "California"
},
{
"name" : "Miami"
}
]
}
对于这样的数据结构,如何进行正确的查询?
嵌套字段有帮助吗?
我应该重新设计数据结构吗?
您应该创建 cities
数组 nested
并发送 nested
查询以过滤 cities.activities.name
。要获得与您的查询匹配的子文档,您应该使用 inner_hits
,因为默认情况下 elasticsearch return 的整个文档和与您的过滤器不匹配的文档将在结果中继续 return。
这是一个示例查询,您应该检查结果中的 inner_hits
:
{
"_source": ["cities.name"],
"query": {
"nested": {
"path": "cities",
"query": {
"term": {
"cities.activities.name.keyword": {
"value": "Hicking"
}
}
},
"inner_hits": {
"_source": ["cities.name"]
}
}
}
}