如何在弹性搜索中建立关系

阿列克谢·莫罗佐夫

我知道弹性支持孩子/父母关系,但孩子只能有一个父母。

  • 如果我不使用这种关系而只是写parent_id,我怎么能像所有父母一样加载所有孩子的内心点击?
凯文·奎泽尔

如果要从同一个父级获取有关子级的所有信息,请使用查询:

GET /my-index/_search
{
    "query": {
        "parent_id": {
            "type": "my-child",
            "id": "1"
        }
    }
}

这将带回所有 join 字段设置为my-child(children) 且父 id 等于 1的文档

有趣的是,我没有询问过不止一位家长。如果你想从多个父母那里得到所有的孩子,我可以想到一个应该查询:

GET /my-index/_search
{
    "query": {
        "should": [
            {
                parent_id: { 
                    type: my-child,
                    id: 1
                }
            },
            {
                parent_id: { 
                    type: my-child,
                    id: 2
                }
            }
        ]
    }
}

您在映射中为上述两个查询定义my-child的连接字段的值在哪里my-join-field检查完整的父子设置以获取更多信息。如果您没有在映射中定义连接字段,它将引发错误。

如果你想从所有的父母那里得到所有的孩子,你可以简单地:

GET /my-index/_search
{
    "query": {
        "match":{
            "my-join-field": "my-child"
        }
    }
}

这将带回所有没有父母的孩子。

您也可以使用Has 父查询,但请记住,此特定查询的性能很慢。

如果你想获得所有的文档,父母和孩子:

GET /my-index/_search
{
    "query": {
        "match_all":{}
    }
}

但是,如果您有不属于父母或子女关系的其他文件:

GET /my-index/_search
{
    "query": {
        "must":{
            "exists":{
                "field": "my-join-field"
            }
        }
    }
}

这将排除所有没有该字段的文档 my-join-field

请记住,ElasticSearch 并不是要像 SQL 那样的关系型 ER 数据库。父子关系只是一种 1-n 关系。不支持关系 nn。

希望这是有帮助的!:D

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章