我使用Neo4j作为我的主数据库。这是一个很好的图表数据库,可以让我很好地控制节点之间的连接。然而,它似乎高度缺乏搜索全文(在网站上搜索功能)。因此,我正在考虑使用Elasticsearch在我的应用程序上创建搜索功能。但是在这样做的时候几乎没有什么问题。假设我们正在搜索用户的帖子。在neo4j中,posts可以有以下模型。
(post)<-[:AUTHOR]-(user)
(post)-[:LIKED_BY]->(otherusers)
(post)-[:COMMENTED_BY]->(otherusers)
(post)-[:HAS_PHOTO]->(photos)Neo4j (比方说在用户配置文件中获取帖子时)的好处是,您可以同时抓取所有这些信息(当您访问它时,如果您已经喜欢该帖子,也可以获取它的配置文件图片和用户详细信息)。这是一个查询(cypher命令)中的很多细节。现在,如果我们想给出与Elasticsearch输出相同的详细信息,我现在可以考虑以下几点:
除了这些,还有什么解决办法吗?这些听起来有点低效。
发布于 2015-01-22 18:26:02
这是一个基于观点的问题,因为它没有一个“正确”的答案,所以准备好让这个无趣的锤子掉下来……但是我一直在想,一到二( Elasticsearch,然后Neo)穿孔是处理这个问题的最好方法:在Elasticsearch中执行索引属性,执行全文搜索以获得可能的ID,然后构建一个将结果限制为返回ID的Cypher匹配。
在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...and --它将知道教训模型正在使用Elasticsearch,执行查询,然后为用户更改查询,因此实际上如下所示:
student.lessons(:l).where('ID(l) IN {elasticsearch_results}').params(elasticsearch_results: [1, 2, 3, 4]).to_a`我一直在使用搜索踢与Neo的全文搜索,它一直进展顺利。我觉得这是可行的。不是解决你的问题,但这是我如何思考它,所以也许它会给你一些想法。
值得注意的是,Neo使用=~进行模糊搜索,只是不使用索引,因此可能会影响性能。不过,这可能不是一个问题,因为您可以过滤节点数和属性,Cypher必须通过向查询的其他部分添加更多信息来检查。您应该对数据进行一些基准测试,以确定是否需要增加Elasticsearch和更复杂的查询的开销。
发布于 2015-02-05 07:51:33
我也在寻找Neo4J & Elasticsearch集成。我看过"Neo4j河ElasticSearch插件“。但我不知道怎么用。如果你们能找到与"Neo4j河插件ElasticSearch“集成的任何信息,请告诉我,这将是非常有用的。
https://stackoverflow.com/questions/28094985
复制相似问题