我是Elastic Search的新手。我有一个用例,似乎可以通过父子关系解决。上级文档包含非政府组织的描述。子文档包含发送给NGO的各种反馈。
Parent Doc structure
{
name
address
description
}
Child doc
{
feedbackContent
}
比方说,NGO-A 4个反馈(意味着4个子文档)
最佳老师
最好的设施
好学生
位置太远
另一个NGO-B有2个反馈(意味着2个子文档)
良好的食品品质
很棒的位置
客户端应该能够查询传递了查询字符串中所有术语的NGO。示例-客户搜索 “最佳”和“位置”。
由于best
存在于child1和child2中,而location
存在于孩子4中,因此NGO-A是有效的输出。但是,由于NGO-B child2包含一个搜索词,而另一个搜索词在其他任何子文档中都不存在,因此NGO-B不是有效的结果。
我阅读了文档-https://blog.mimacom.com/parent-child-elasticsearch/,该文档相当不错,但无法断定是否可以做到这一点。
我尝试过的例子
PUT message_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"mapping.single_type": true
},
"mappings": {
"doc": {
"properties": {
"ngo": {"type": "text"},
"feedback": {"type": "text"},
"ngo_relations": {
"type": "join",
"relations": {
"ngo": "feedback"
}
}
}
}
}
}
POST message_index/doc/_bulk
{"index": {"_id":1}}
{"name":"teach for india", "ngo_relations": {"name":"ngo"}}
{"index":{"_id":2}}
{"name":"hope for autism", "ngo_relations": {"name":"ngo"}}
PUT message_index/doc/3?routing=1
{"feedback":"best food","ngo_relations":{"name":"feedback", "parent":1}}
PUT message_index/doc/4?routing=1
{"feedback":"average location","ngo_relations":{"name":"feedback", "parent":1}}
PUT message_index/doc/5?routing=1
{"feedback":"awesome staff","ngo_relations":{"name":"feedback", "parent":1}}
PUT message_index/doc/6?routing=2
{"feedback":"best teachers","ngo_relations":{"name":"feedback", "parent":2}}
PUT message_index/doc/7?routing=2
{"feedback":"awesome overload","ngo_relations":{"name":"feedback", "parent":2}}
为了获得最佳和位置搜索,请只为印度NGO教书。
没有点击:
GET message_index/_search
{
"query": {
"has_child": {
"type": "feedback",
"query": {
"bool": {
"must": {
"term": {"feedback": "best"}
},
"must": {
"term": {"feedback": "location"}
}
}
}
}
}
}
两个文件都被退回
GET message_index/_search
{
"query": {
"has_child": {
"type": "feedback",
"query": {
"bool": {
"should": {
"term": {"feedback": "best"}
},
"should": {
"term": {"feedback": "location"}
}
}
}
}
}
}
答案 0 :(得分:1)
这可以做到。您接近查询中的一个小错误。
在子查询中,您要执行两个必须/应该的布尔运算。因此,您的查询是:给我所有文件,使他们拥有一个孩子,以便该孩子同时拥有“最佳”和“位置”这两个词(或在应有的情况下为“其中一个”)。
您想要的是:给我所有文件,使他们有一个孩子,使该孩子拥有“最佳”一词,并且也有一个孩子,使该孩子具有“地点”一词。
按以下方式调整您的查询:
GET message_index/_search
{
"query": {
"bool": {
"must": [
{
"has_child": {
"type": "feedback",
"query": {
"term": {
"feedback": "best"
}
}
}
},
{
"has_child": {
"type": "feedback",
"query": {
"term": {
"feedback": "location"
}
}
}
}
]
}
}
}