一尘不染

Elasticsearch关系映射(一对一和一对多)

elasticsearch

在我的elasticsearch服务器中,我只有一个索引http://localhost:9200/blog
(博客)索引包含多种类型。

如:http://localhost:9200/blog/postshttp://localhost:9200/blog/tags

在标签类型中,我创建了1000多个标签,并在帖子类型中创建了10个帖子。

例如:帖子

{   
    "_index":"blog",
    "_type":"posts",
    "_id":"1",
    "_version":3,
    "found":true,
    "_source" : {
        "catalogId" : "1",
       "name" : "cricket",
       "url" : "http://www.wikipedia/cricket"
    }
}

例如:标签

{   
    "_index":"blog",
    "_type":"tags",
    "_id":"1",
    "_version":3,
    "found":true,
    "_source" : {
        "tagId" : "1",
        "name" : "game"
    }
}

我想将现有标签分配给博客帖子(即,关系=>映射)。

如何将标签分配给帖子映射?


阅读 1148

收藏
2020-06-22

共1个答案

一尘不染

您可以在Elasticsearch中使用4种方法来管理关系。在Elasticsearch博客文章-Elasticsearch
内部的关系管理中,对它们进行了很好的概述。我建议阅读整篇文章,以获取每种方法的更多详细信息,然后选择最能满足您的业务需求同时又在技术上适当的方法。

以下是这4种方法的重点。

内部对象

  • 简单,快速,高效
  • 仅在保持一对一关系时适用
  • 无需特殊查询

巢状

  • 嵌套文档彼此存储在相同的Lucene块中,这有助于提高读取/查询性能。读取嵌套文档比同等的父/子更快。
  • 更新嵌套文档(父级或嵌套子级)中的单个字段会强制ES重新为整个嵌套文档编制索引。对于大型嵌套文档而言,这可能会非常昂贵
  • “交叉引用”嵌套文档是不可能的
  • 最适合不经常更改的数据

父母/子女

  • 子项与父项分开存储,但被路由到同一分片。因此,父级/子级在读取/查询时的性能略低于嵌套的性能
  • 父/子映射有一些额外的内存开销,因为ES在内存中维护“连接”列表
  • 更新子文档不会影响父文档或其他任何子文档,这可能会节省大型文档的大量索引
  • 使用“父/子”操作可能很难进行排序/评分,因为“有子/父”操作有时可能不透明

非规范化

  • 您可以自己处理所有关系!
  • 最灵活,最行政
  • 可能会有所不同,具体取决于您的设置
2020-06-22