在我的弹性搜索服务器中,我有一个索引http://localhost:9200/blog
(博客)索引包含多种类型。
例如:http://localhost:9200/blog/posts
,http://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"
}
}
我想将现有标签分配给博客帖子(即relationship => mapping)。
如何将标签分配给帖子映射?
答案 0 :(得分:51)
您可以在Elasticsearch中使用4种方法来管理关系。它们在Elasticsearch博客文章中得到了很好的概述 - Managing Relations Inside Elasticsearch我建议您阅读整篇文章以获取有关每种方法的更多详细信息,然后选择最符合您业务需求的方法,同时保持技术上的合理性。
以下是4种方法的重点。
内部对象
- 简单,快速,高效
- 仅在维持一对一关系时适用
- 无需特殊查询
<强>嵌套强>
- 嵌套文档彼此存储在相同的Lucene块中,这有助于读取/查询性能。读取嵌套文档的速度比等效的父/子快。
- 更新嵌套文档中的单个字段(父级或嵌套子级)会强制ES重新索引整个嵌套文档。对于大型嵌套文档来说,这可能非常昂贵
- “交叉引用”嵌套文档是不可能的
- 最适合不经常更改的数据
<强>父/子强>
- 子项与父项分开存储,但路由到同一个分片。因此,父/子在读/查询上的性能略低于嵌套
- 父/子映射有一点额外的内存开销,因为ES在内存中维护一个“连接”列表
- 更新子doc不会影响父级或任何其他子级,这可能会在大型文档上节省大量索引
- 使用父/子进行排序/评分可能很困难,因为有孩子/有父母操作有时可能不透明
<强>非规范化强>
- 你自己管理所有的关系!
- 最灵活,最管理的开销
- 根据您的设置,可能或多或少具有高效性