2

在 Rails 应用程序中使用 Neo4j。

我有几个字符串属性的节点,其中包含长字符串的用户生成内容。例如,在我的类型节点中:“Book”,我可能有属性“review”和“summary”,它们将包含长格式的字符串值。

我试图设计返回节点的查询,这些节点将这些属性与用户在搜索框中提供的一般语言搜索词相匹配。随着我的查询变得越来越复杂,我突然想到我正在尝试解决自然语言搜索。

我查看了 Rails 中一些流行的搜索 gem,但它们似乎都依赖于 ActiveRecord。Neo4j.rb 有哪些搜索解决方案?

4

2 回答 2

2

有几种方法可以解决这个问题!

正如 FrobberOfBits 所说,Neo4j 有所谓的“遗留索引”,它使用 Lucene 作为背景来提供通用事物的索引。它确实支持新的模式索引。不幸的是,这些都是基于完全匹​​配的(尽管我很确定在 Neo4j 2.3.x 中会有所改变)。

Neo4j 确实支持通过=~运算符对字符串进行模式匹配,但这些查询没有被索引。所以性能取决于数据库的大小。

我们经常推荐一个名为的 gem searchkick,它可以让您在模型中为 Elasticsearch 定义索引。然后你可以调用一个Model.search方法来进行搜索,它会首先查询 elasticsearch 以获取节点 ID,然后通过 Neo4j.rb 加载这些节点。您可以通过neo4j-searchkickgem 使用它:https ://github.com/neo4jrb/neo4j-searchkick

最后,如果您正在执行 NLP 并尝试从文本中提取重要单词,您可以创建Tag/Word标签并创建从节点到这些 NLP 提取节点的关系,以便您将来可以基于这些节点进行搜索。您甚至可以根据常见标签节点的数量/类型构建从一个文本节点到另一个文本节点的推荐。

于 2015-10-08T20:02:10.183 回答
0

我不知道 neo4j.rb 和 activerecord 是否存在任何特定的东西。我能说的是,通常这些东西是通过使用由 Lucene 实现的遗留索引来处理的。

前提是您在某些属性上创建一个 lucene 管理的索引,然后您可以通过 cypher 使用 Lucene 查询语言从这些索引中获取数据。相对于 neo4j.rb,它看起来与运行密码查询没有任何不同,如下所示:

START item=node:node_auto_index("(title:'foo bar' AND body:baz*) OR title:'bat'")
RETURN item

请注意,lucene 索引和查询语言只能在START块中使用,而不是在MATCH块中使用。请参阅Lucene 查询语法以了解更多关于您可以使用该查询语法(模糊匹配、通配符等 - 比正则表达式提供给您的内容更广泛)的更多信息。

于 2015-10-08T17:06:55.587 回答