我是Elastic Search的新手。我有一个用例,似乎可以通过父子关系解决。上级文档包含非政府组织的描述。子文档包含发送给NGO的各种反馈。
Parent Doc structure
{
name
address
description
}
Child doc
{
feedbackContent
}
假设NGO-A提供了4个反馈(意味着有4个子文档)
另一个NGO-B有2个反馈(意味着2个子文档)
客户应该能够查询在查询字符串中传递了所有术语的NGO。示例-客户搜索
“最佳”和“位置”。
由于子代1和子代2中存在
best
,子代4中存在location
,因此NGO-A是有效输出。但是,对于NGO-B,child2包含一个搜索词,而另一个搜索词在任何其他子文档中均不存在,因此NGO-B不是有效的结果。我读了doct-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"}
}
}
}
}
}
}
最佳答案
可以做到的。您接近查询中的一个小错误。
在子查询中,您要通过两个必须/应该进行 bool(boolean) 运算。因此,您的查询是:给我所有文件,使他们拥有一个 child ,以便该 child 同时拥有“最佳”和“位置”这两个词(或在应有的情况下为“其中一个”)。
而您想要的是:给我所有文件,使他们生一个 child ,使 child 拥有“最佳”一词,并且也有一个 child ,使 child 具有“地点”一词。
调整您的查询,如下所示:
GET message_index/_search
{
"query": {
"bool": {
"must": [
{
"has_child": {
"type": "feedback",
"query": {
"term": {
"feedback": "best"
}
}
}
},
{
"has_child": {
"type": "feedback",
"query": {
"term": {
"feedback": "location"
}
}
}
}
]
}
}
}
关于elasticsearch - ElasticSearch中的父子关系-在所有子文档中搜索句子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56385001/