pew*_*ers 11 neo4j cypher elasticsearch
我使用Neo4j作为我的主数据库.它是一个很好的图形数据库,可以很好地控制节点之间的连接.但是,它似乎在搜索全文(网站上的搜索功能)方面缺乏高度.因此,我正在考虑使用Elasticsearch在我的应用程序上创建搜索功能.但这样做有一些问题.假设我们正在搜索用户帖子.在neo4j帖子中可以有以下模型.
(post)<-[:AUTHOR]-(user)
(post)-[:LIKED_BY]->(otherusers)
(post)-[:COMMENTED_BY]->(otherusers)
(post)-[:HAS_PHOTO]->(photos)
Run Code Online (Sandbox Code Playgroud)
关于Neo4j的好处(让我们说在用户个人资料中获取帖子)是你可以一次抓住所有这些(也可以在你看到它时如果你已经喜欢这个帖子的情况下提供图片和用户详细信息).这是一个查询(cypher命令)中的很多细节.现在,如果我们想为Elasticsearch输出提供相同级别的详细信息,我现在可以想到以下内容:
将所有内容存储在Neo4j和Elasticsearch中.搜索文本时,列出elasticsearch本身的结果.但是仍然存在一些问题,例如,如果用户已经喜欢该帖子(这可能需要为每个帖子再次查询neo?这听起来不太好)
在Elasticsearch中存储帖子ID.填充搜索结果时,使用此帖子ID从neo4j数据库中获取每个帖子的信息并显示结果.(10个结果 - > 10个单独的呼叫,再次听起来非常低效)
获取Elasticsearch提供的id列表,并对neo4j进行1次调用并获取结果(不知道如何执行此操作或是否存在性能问题).密码参考可能会有所帮助.
有什么解决方案吗?这听起来有点低效.
这是一个基于意见的问题,因为它没有一个"正确"的答案,所以准备好SO无趣的锤子崩溃......但我一直在想一两( 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
Run Code Online (Sandbox Code Playgroud)
...并且它会知道Lesson模型正在使用Elasticsearch,执行查询,然后更改用户的查询,因此它实际上是这样的:
student.lessons(:l).where('ID(l) IN {elasticsearch_results}').params(elasticsearch_results: [1, 2, 3, 4]).to_a`
Run Code Online (Sandbox Code Playgroud)
我一直在使用Searchkick与Neo进行全文搜索,而且一直都很顺利.我认为这是可行的.不是你的问题的解决方案,但它是我如何思考它,所以也许它会给你一些想法.
值得注意的是,Neo确实使用模糊搜索=~,它只是不使用索引,因此可能会有性能损失.但这可能不是问题,因为您可以通过向查询的其他部分添加更多信息来过滤Cypher必须检查的节点和属性的数量.您应该对数据进行一些基准测试,以确定是否需要增加Elasticsearch的开销和更复杂的查询.
| 归档时间: |
|
| 查看次数: |
6499 次 |
| 最近记录: |