shu*_*qui 2 parent-child elasticsearch elasticsearch-7
我是“弹性搜索”的新手,目前正在尝试了解 ES 如何维持“父子”关系。我从以下文章开始:
https://www.elastic.co/blog/managing-relations-inside-elasticsearch
但是这篇文章基于旧版本的 ES,我目前使用的是 ES 7.5,其中指出:
_parent 字段已被移除,取而代之的是 join 字段。
现在我正在关注这篇文章:
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/parent-join.html
但是,我无法获得所需的结果。
我有一个场景,其中我有两个索引“人”和“家”。每个“人”可以有多个“家”,这基本上是一对多的关系。问题是当我查询获取所有父母为“XYZ”人的房屋时,答案为空。
以下是我的索引结构和搜索查询:
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请求地址:http://hostname/home
{
"mappings": {
"properties": {
"state": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请求网址:http://hostname/person/_doc/1
{
"name": "shujaat",
"person_home": {
"name": "person"
}
}
Run Code Online (Sandbox Code Playgroud)
请求地址:http://hostname/home/_doc/2?routing=1&refresh
{
"state": "ontario",
"person_home": {
"name": "home",
"parent": "1"
}
}
Run Code Online (Sandbox Code Playgroud)
请求网址:http://hostname/person/_search
{
"query": {
"has_parent": {
"parent_type": "person",
"query": {
"match": {
"name": "shujaat"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者
{
"query": {
"has_parent": {
"parent_type": "person",
"query": {
"match": {
"_id": "1"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
Run Code Online (Sandbox Code Playgroud)
我无法理解我在这里遗漏了什么或上面提到的查询有什么问题,因为它没有返回任何数据。
您应该将父文档和子文档放在同一个索引中:
连接数据类型是一个特殊的字段,它在同一索引的文档中创建父/子关系。
因此映射如下所示:
PUT http://hostname/person_home
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"state": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,它具有原始字段person和home索引字段。
您的其余代码应该可以正常工作。尝试将person和home文档插入同一个索引person_home并使用您在问题中发布的查询。
person和home对象具有重叠的字段名称怎么办?假设,两种对象类型都有字段,name但我们想分别索引和查询它们。在这种情况下,我们可以提出这样的映射:
PUT http://hostname/person_home
{
"mappings": {
"properties": {
"person": {
"properties": {
"name": {
"type": "text"
}
}
},
"home": {
"properties": {
"name": {
"type": "keyword"
},
"state": {
"type": "text"
}
}
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们应该改变对象本身的结构:
PUT http://hostname/person_home/_doc/1
{
"name": "shujaat",
"person_home": {
"name": "person"
}
}
PUT http://hostname/person_home/_doc/2?routing=1&refresh
{
"home": {
"name": "primary",
"state": "ontario"
},
"person_home": {
"name": "home",
"parent": "1"
}
}
Run Code Online (Sandbox Code Playgroud)
如果您必须将旧数据从两个旧索引迁移到新合并的索引中,则reindex API可能有用。
| 归档时间: |
|
| 查看次数: |
4093 次 |
| 最近记录: |