让我们说我有用户,团队和运动员的文件。用户文档具有与团队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
}
}
答案 0 :(得分: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 sports / athlete?parent = dc2b3e8f-7dea-4898-9852-538c0d0367f4
{
"name" : "Gil Fernandes"
}
请注意,“dc2b3e8f-7dea-4898-9852-538c0d0367f4”是弹性搜索中团队的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"
}
} ]
}
}