【问题标题】:Searching through polymorphic data with Elasticsearch使用 Elasticsearch 搜索多态数据
【发布时间】:2017-02-02 21:47:30
【问题描述】:

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

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

我已经寻找其他处理此问题的示例,但找不到任何示例。文档中似乎也没有任何内容。我是否忽略了一些显而易见的事情,或者 Elasticsearch 只是不适合做这样的事情?

亲切的问候,

史蒂芬

【问题讨论】:

    标签: search elasticsearch types polymorphism scoring


    【解决方案1】:

    这不是 Elasticsearch 本身的问题,而是底层 lucene 索引的问题(或限制)。所以,任何基于 lucene 的 db/engine 都会有同样的问题(如果不是更糟的话:),ES 为你做了很多工作)。 ES 可能会在进一步的版本中减轻痛苦,但不会显着。而且 IMO,几乎没有任何高性能搜索引擎可以处理真正的多态数据。

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

    1. 将所有数据放在单个索引中,并按类型拆分。而且您已经知道开销 - 透明索引在稀疏数据上效果不佳。您的数据越相似,您遇到的问题就越少。无论如何,ES 会为“缺失”值做所有底层工作,你只需要处理存储稀疏数据的内存/磁盘开销。

      如果您的数据是按父子关系组织的(即视频 -> 播放列表),那么您肯定需要为此类数据提供单一索引。这只会让您使用这种方法。

    2. 将您的数据划分为多个索引。这样,在聚合来自多个分片的数据时,lucene 索引的磁盘开销会稍高+ CPU 使用率可能更高(因此,您应该分别调整分片)。

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

    所以,这看起来纯粹是关于您的数据结构的问题。我建议简单地启动小型集群来测量预期数据的内存/磁盘/cpu 使用情况。有关“索引与分片”的更多详细信息 – Adrien 的 article 很棒。

    有点题外话,如果 ES 似乎不能满足你的需求,我建议你 仍然考虑在应用程序端合并数据。 ES 可以很好地处理多个轻请求(而不是几个较重的请求),并且由于 ES 的结果已经排序,您需要合并具有排序输入的排序流。那里没有那么多魔法,tbh。

    【讨论】:

    • 在应用端合并结果的问题是查询之间的评分没有意义,所以虽然流是排序的,但不同流相互关联的方式仍然适合你定义,这就是我所说的魔法。否则,非常感谢您的回答!我还没有真正关心开销,但我确实记得阅读过有关 Lucene 和稀疏数据的问题。多态数据的性质使得任何搜索引擎都难以处理,尽管我希望在某个地方会有更多示例。
    • 我想说,如果评分是目前唯一的问题 - 尝试多类型单索引查询。如果您数据中的相同字段在类型/含义上相同(希望如此,如果您需要这样的评分:)),请尝试一下。如果它对您来说很慢/不可用,您可以尝试使用 MongoDB(真正的多态,呵呵),但仅使用有线老虎存储引擎(基本上,v3+)。不幸的是,3 之前的版本不适用于任何高性能聚合/分析。
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多