gpt4 book ai didi

elasticsearch - Elastic Search 7.5中的父子关系

转载 作者:行者123 更新时间:2023-12-02 22:47:39 25 4
gpt4 key购买 nike

我是“ flex 搜索”的新手,目前正在尝试了解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

但是,我无法获得理想的结果。

我有一个方案,其中有两个索引“人”和“家”。每个“人”可以有多个“家”,这基本上是一对多的关系。问题是,当我查询以获取其 parent 是“XYZ”人的所有房屋时,答案为空。

以下是我的索引结构和搜索查询:

人员指数:

要求网址:http://hostname/person

{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}

房屋指数:

要求网址: http://hostname/home
{
"mappings": {
"properties": {
"state": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}

亲自添加数据索引

要求网址: http://hostname/person/_doc/1
{
"name": "shujaat",
"person_home": {
"name": "person"
}
}

在首页索引中添加数据

要求网址: http://hostname/home/_doc/2?routing=1&refresh
{
"state": "ontario",
"person_home": {
"name": "home",
"parent": "1"
}
}

查询以获取数据:(以获取其父代的人ID为“1”的所有记录)

要求网址: http://hostname/person/_search
   {
"query": {
"has_parent": {
"parent_type": "person",
"query": {
"match": {
"name": "shujaat"
}
}
}
}
}

要么
{
"query": {
"has_parent": {
"parent_type": "person",
"query": {
"match": {
"_id": "1"
}
}
}
}
}

响应:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}

我无法理解我在这里缺少什么,或者上述查询出了什么问题,因为它没有返回任何数据。

最佳答案

您应该将父文档和子文档in the same index放入:

The join datatype is a special field that creates parent/childrelation within documents of the same index.


因此,映射如下所示:
PUT http://hostname/person_home
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"state": {
"type": "text"
},
"person_home": {
"type": "join",
"relations": {
"person": "home"
}
}
}
}
}
请注意,它同时具有原始 personhome索引中的两个字段。
您的其余代码应该可以正常工作。尝试将 personhome文档插入相同的索引 person_home,并使用您在问题中发布的查询。
如果 personhome对象的字段名称重叠怎么办?
假设两个对象类型都有字段 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"
}
}
}
}
}
现在,我们应该更改对象本身的结构:
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"
}
}
如果必须将旧数据从两个旧索引迁移到新的合并索引中,则可以使用 reindex API

关于elasticsearch - Elastic Search 7.5中的父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59862658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com