【问题标题】:Combining Neo4j and Elasticsearch结合 Neo4j 和 Elasticsearch
【发布时间】:2015-03-21 14:40:31
【问题描述】:

我使用 Neo4j 作为我的主数据库。这是一个很好的图形数据库,让我可以很好地控制节点之间的连接。但是,它似乎在搜索全文(网站上的搜索功能)方面缺乏高度。因此,我正在考虑使用 Elasticsearch 在我的应用程序上创建搜索功能。但是这样做时几乎没有问题。假设我们正在搜索用户帖子。在 neo4j 帖子中可能有以下模型。

(post)<-[:AUTHOR]-(user)
(post)-[:LIKED_BY]->(otherusers)
(post)-[:COMMENTED_BY]->(otherusers)
(post)-[:HAS_PHOTO]->(photos)

Neo4j 的好处(假设在用户个人资料中获取帖子)是您可以一次获取所有这些内容(如果您已经喜欢该帖子,还可以获取个人资料图片和用户详细信息)。这是一个查询(密码命令)中的很多细节。现在,如果我们想为 Elasticsearch 输出提供相同级别的详细信息,我现在可以考虑以下内容:

  1. 将所有内容存储在 Neo4j 和 Elasticsearch 中。当搜索文本时,会列出来自 elasticsearch 本身的结果。但是仍然存在诸如获取用户是否已经喜欢该帖子的问题(这可能需要为每个帖子再次查询neo?这听起来不太好)

  2. 在 Elasticsearch 中存储帖子 ID。填充搜索结果时,使用此帖子 id 从 neo4j 数据库中获取每个帖子的信息并显示结果。 (10 个结果 -> 10 个单独的调用,听起来又非常低效)

  3. 获取 Elasticsearch 提供的 id 列表并对 neo4j 进行 1 次调用并获取结果(不知道如何执行此操作或是否存在性能问题)。密码参考可能会有所帮助。

除此之外还有什么解决方案吗?这些听起来有点低效。

【问题讨论】:

  • 嗨@pewpewlasers,我们刚刚发布了这个:graphaware.com/neo4j/2016/04/20/…
  • @ChristopheWillemsen 嘿,感谢您的链接,看起来是一个很棒的项目。一定会检查出来的。有关性能和可扩展性的任何信息?
  • 性能高度依赖于密码查询、reco 引擎甚至 ES 和 neo4j 之间的延迟的性能。它当然会增加 ES 查询时间的总延迟(我们有时测量原始密码为 40 毫秒,在 neo4j 端使用基于 Java 的引擎时为 10 毫秒)。然而,我们已经使用最新版本的 neo4j 和二进制协议而不是 http 对此进行了改进。
  • @ChristopheWillemsen 好的,谢谢。一定会检查出来的。
  • @ChristopheWillemsen 是否有安装指南的链接将 neo4j 3.0.1 与弹性搜索 5.0 集成?

标签: elasticsearch neo4j cypher


【解决方案1】:

我也在寻找 Neo4J 和 Elasticsearch 的集成。我看过“用于 ElasticSearch 的 Neo4j River 插件”。但我不知道如何使用它。如果你们发现任何有关与“用于 ElasticSearch 的 Neo4j River 插件”集成的信息,请告诉我,这将非常有帮助。

【讨论】:

【解决方案2】:

这是一个有点基于意见的问题,因为它没有“正确”的答案,所以准备好让这个无趣的锤子崩溃......但我一直认为这是一个-two(Elasticsearch 然后 Neo)punch 是处理这个问题的最佳方法:在 Elasticsearch 中索引属性,执行全文搜索以获取可能的 ID,然后构建一个 Cypher 匹配,将结果限制为返回的 ID。

在 Cypher 中,您可以使用 IN [] 返回在数组中匹配的记录。所以你可以做MATCH (u:Student { age: 30 }) WHERE ID(u) IN [1, 2, 3, 4] RETURN u。那么,将 Elasticsearch 与 Neo 集成的诀窍在于,可以轻松地围绕 ES 结果构建 Cypher 查询。我真的没有关于这样做的提示,因为这取决于您的语言和驱动程序。

在 Neo4j.rb 中,我正在考虑尝试将其自动化,以便您可以这样做:

student.lessons(:l).where(name: 'Chris').to_a

...它会知道课程模型正在使用 Elasticsearch,执行查询,然后为用户更改查询,因此实际上是这样的:

student.lessons(:l).where('ID(l) IN {elasticsearch_results}').params(elasticsearch_results: [1, 2, 3, 4]).to_a`

我一直在使用 Searchkick 进行 Neo 的全文搜索,并且运行良好。我认为这是可行的。不是解决你的问题,但这是我的想法,所以也许它会给你一些想法。

值得注意的是,Neo 确实使用=~ 进行模糊搜索,它只是不使用索引,因此可能会影响性能。不过,这可能不是问题,因为您可以通过向查询的其他部分添加更多信息来过滤 Cypher 必须检查的节点和属性的数量。您应该对您的数据进行一些基准测试,以确定是否需要增加 Elasticsearch 的开销和更复杂的查询。

【讨论】:

  • 感谢您的洞察力。只是一个问题,WHERE ID(u) IN [1, 2, 3, 4] RETURN u 的性能如何?如果有超过 200,000 条或更高的记录(索引已到位),它会很慢吗?换句话说,这个密码能很好地扩展吗?
  • 使用 ID 是从数据库加载节点的最快方式。我不知道它在幕后是如何工作的,但我很确定它会立即使用这些 ID 过滤结果,然后从那里向外工作,所以它应该可以很好地扩展。使用 ID 时只需谨慎行事。
  • 另外,我最近从 SO 评论中了解到一件事:neo4j 的未来(下一个?)版本将使用=~ 条件的索引!
  • 注意:ID 是暂时的。不要依赖它们,除非您以临时方式加载它们(例如,从查询中返回 ID,然后在第二个查询中使用它们)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多