假设我有用户,团队和运动员文档。用户文档具有与团队ID相关的对象数组。将密钥与用户归档匹配后,我需要在单个查询中从团队获取相关数据。
我有下面的东西
"size": 20,
"query": {
"bool": {
"filter" : [
{"terms" : { "_type" :["users","athletes"] }}
],
"should":[{
"multi_match" : {
"query":searchQuery,
"type":"cross_fields",
"fields":["firstName", "email","lastName","name"],
"minimum_should_match": "80%"
}
}
],
"minimum_should_match" : 1
}
}
最佳答案
ElasticSearch在这方面受到限制,但是您可以使用has_child查询来查询运动员并获得相应的团队。
为了使用has_child
查询,您需要在索引定义中建立团队与运动员之间的父子关系:
PUT运动
{
"mappings" : {
"team" : {
"properties" : {
"name" : {
"type" : "text"
}
}
},
"athlete" : {
"dynamic" : "false",
"_parent" : {
"type" : "team"
},
"_routing" : {
"required" : true
},
"properties" : {
"name" : {
"type" : "text"
}
}
}
}
}
注意
"_parent"
元素。然后,您需要向父实体(团队)添加一些数据:
PUT体育/团队
{
"name" : "A"
}
然后,您将需要索引一些将它们与父级关联的运动员:
PUT运动/运动员? parent = dc2b3e8f-7dea-4898-9852-538c0d0367f4
{
"name" : "Gil Fernandes"
}
请注意,“dc2b3e8f-7dea-4898-9852-538c0d0367f4”是Elastic Search中团队的ID。
最后,您可以执行has_child查询:
{
"from" : 0,
"size" : 20,
"_source" : true,
"query" : {
"bool" : {
"must" : [ {
"has_child" : {
"type" : "athlete",
"query" : {
"match" : {
"name" : "Gil Fernandes"
}
}
}
} ]
}
}
}
结果,您将获得运动员团队:
{
"took" : 10,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "sports",
"_type" : "team",
"_id" : "dc2b3e8f-7dea-4898-9852-538c0d0367f4",
"_score" : 1.0,
"_source" : {
"name" : "A"
}
} ]
}
}
关于elasticsearch - 如何像jon查询一样从elasticsearch获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46278000/