如何在我的节点中跨字符串属性进行常规搜索?

时间:2015-10-08 16:05:56

标签: ruby-on-rails neo4j neo4j.rb

在Rails应用程序中使用Neo4j。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

Neo4j确实通过=~运算符支持字符串上的模式匹配,但这些查询未编入索引。因此,性能取决于数据库的大小。

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

使用它

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

答案 1 :(得分:0)

我不知道neo4j.rb和activerecord是否存在任何具体内容。我可以说的是,通常这些东西是通过使用legacy indexes that are implemented by Lucene来处理的。

前提是您在某些属性上创建lucene管理的索引,然后通过cypher使用Lucene查询语言从这些索引中获取数据。相对于neo4j.rb,it doesn't look any different than running cypher queries,像这样:

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

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