在 ElasticSearch 中存储线程视图

Store a threaded view in ElasticSearch

我正在解析一个线程论坛(具有 parent_id 连接的树)并试图在保持层次结构的同时将单个帖子存储在 ElasticSearch 中。但是我不太确定最好的方法是什么。

parent/child模型:这里的难点在于,根元素没有父元素+我不确定我是否可以指向_parent 到它自己的类型。

这也是一个额外的问题。插入时,我是否需要将父级作为查询参数传递,或者我也可以将其添加到数据对象中吗?

嵌套模型:我无法提前判断树可能有多深,而且我真的不想将 无用 对象放入映射

我觉得这不是一项不常见的任务,所以任何建议都很好!

我不建议为此目的采用您的方法。

同时使用 parent/childnested 你将不得不 pre-define 你的树的最大深度,并用一些令人讨厌的映射来表达这一点。 (在您的搜索查询中枚举每个级别的字段。)

使用 parent/child 您实际上会为每个级别创建额外的索引,这会增加不必要的资源开销。

Elasticsearch 是您的主要数据源吗?如果没有,请考虑将论坛帖子简单地索引为一个平面 collection 文档,其中包含足够的信息,以便能够从您的主要文档中重建线程。例如:

POST

  • 线程 ID
  • 作者 ID (搜索可能不需要?)
  • Post ID
  • Parent ID (搜索可能不需要?)
  • Post 日期
  • Post 标题
  • Post Body

然后 Elasticsearch 被简化为文本搜索/突出显示引擎的角色,并且会很乐意为您返回片段和 Post IDs/Thread 从数据库中重建线程所需的 ID。

如果 Elasticsearch 您的主要存储,那么希望 you've read this thread already. There is a commercial Elasticsearch plugin created by Siren Solutions 使 Elasticsearch 能够像您一样管理真正无模式的嵌套数据。