Elasticsearch 和 Pinot 都在内部使用 Apache Lucene。他们的索引策略有何不同?
PS 我完全有效的答案由于一个糟糕的问题而被删除,因为它是“基于意见的”。因此,发布带有有效问题的答案,以便它对社区有用。
Apache Pinot 和 Elasticsearch 解决了不同的问题。
Elasticsearch 是一个用于全文搜索、模糊查询、搜索词自动完成等的搜索引擎。它使用一种叫做倒排索引的东西来实现这一点。传统的索引使用排序索引,其中文档存储为键,关键字存储为值。在这种情况下,查询延迟会非常高,因为需要搜索整个文档。但是在倒排索引中,关键字存储为键,文档 ID 存储为值。在这里,由于只需要搜索搜索关键字,查询延迟会非常低。因此,Elasticsearch 使用倒排索引来解决其核心目的,即“搜索”。
Apache Pinot 不是为“搜索”而构建的。它是为实时分析而构建的。它使用一种叫做星树索引的东西,它类似于数据所有维度的所有组合的预聚合值存储。如您所见,Apache Pinot 对数据的聚合派生/减少感兴趣,而不是数据本身。它使用这些预先聚合的值来提供对数据的极低延迟的实时分析。
Apache Pinot 的一个非常重要的用例是计算实时每个用户级别的分析并呈现面向每个用户的实时仪表板。Elasticsearch 也可以使用 Kibana 呈现实时仪表板,但由于它使用倒排索引方法,因此不适用于每用户级别的分析,因为这会给服务器带来巨大的负载,并且需要大量的弹性实例。由于这个上限,Elasticsearch 不适合每个用户级别的分析。
因此,如果您希望在您的应用程序中具有搜索功能以及每用户级别的分析,最好的方法是让 Elasticsearch 和 Pinot 消费者通过并行管道从同一个 Kafka 主题中摄取数据。这样,当 Elasticsearch 为搜索目的索引数据时,Pinot 将处理数据以进行每个用户级别的分析。