使用Elasticsearch搜索多态数据

时间:2016-09-25 14:11:05

标签: search elasticsearch types polymorphism scoring

我对Elasticsearch和多态数据的基本问题感到困惑。我希望能够通过一个Elasticsearch查询找到多种类型的结果(例如用户,视频和播放列表)。它必须只是一个查询,因为Elasticsearch可以做所有的评分,我不需要做任何魔术来组合不同类型的多个查询结果。

我知道Elasticsearch使用平面文档结构,这让我遇到了以下问题。如果我索引多态数据,我将不得不为多态数据的子类型中我关心的每个唯一属性指定一个“缺失”值。

我已经找到了其他处理此问题的示例,但找不到任何问题。文档中似乎没有任何内容。我是否忽略了一些明显的东西,或者Elasticsearch是不是设计用于做这样的事情?

亲切的问候,

STEFFAN

1 个答案:

答案 0 :(得分:0)

这不是Elasticsearch本身的问题,而是底层lucene索引的问题(或限制)。因此,任何基于lucene的数据库/引擎都会遇到同样的问题(如果不是更糟糕的话:),ES会为你做很多工作)。可能ES会缓解进一步发布的痛苦,但不会显着。和IMO一样,几乎没有任何高性能搜索引擎能够承受真正的多态数据。

答案取决于您的数据结构,这是肯定的。基本上,您有两种选择:

  1. 将所有数据放在单个索引中,然后按类型拆分。并且您已经知道开销 - 朗讯索引与稀疏数据的效果不佳。您的数据越相似,问题就越少。无论如何,ES将为"缺少"做所有基础工作。值,您只需要处理存储稀疏数据的内存/磁盘开销。

    如果您的数据是使用父子关系(即视频 - >播放列表)进行组织的,那么您肯定需要单个索引来处理此类数据。只留下这种方法。

  2. 将您的数据划分为多个索引。这样,当从多个分片聚合数据时,lucene索引的磁盘开销会略高一些;可能会有更高的CPU使用率(所以,你应该分别调整分片)。

    您仍然可以在单个请求中查询ES以查找所有文档,因为ES支持multi-index个查询。

  3. 所以,这看起来像纯粹是你的数据结构的问题。我建议只需启动小型集群来测量预期数据的内存/磁盘/ CPU使用情况。关于" index vs shard"的更多细节 - Adrien的伟大article

    稍微偏离主题,如果ES似乎没有满足您的需求,我建议您这样做 仍然考虑在应用方面合并数据。 ES适用于多个轻量级请求(而不是几个较重),并且由于ES的结果已经排序,您需要合并已排序输入的已排序流。那里没那么神奇,tbh。