【问题标题】:Elasticsearch relationship mappings (one to one and one to many)Elasticsearch 关系映射(一对一和一对多)
【发布时间】:2014-06-17 15:54:28
【问题描述】:

在我的弹性搜索服务器中,我有一个索引 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"
    }
}

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

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

【问题讨论】:

    标签: elasticsearch mapping relationship elastica


    【解决方案1】:

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

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

    内部对象

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

    嵌套

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

    父母/子女

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

    非规范化

    • 您可以自己管理所有关系!
    • 最灵活、管理开销最大
    • 可能或多或少的性能取决于您的设置

    【讨论】:

    • 简洁的优点和缺点列表。
    • 说父子查询的性能比嵌套查询“略”低可能会产生误导。从我们看到的情况来看,它会差 1-2 个数量级,具体取决于索引大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多