字符串中单词的模式索引

时间:2015-11-19 13:17:41

标签: indexing neo4j lucene

我有大量节点,其属性text包含字符串。

我想找到文本包含给定字符串的所有节点(完全匹配)。这可以使用CONTAINS运算符完成。

MATCH (n)
WHERE n.text CONTAINS 'keyword'
RETURN n

编辑:我正在寻找所有节点n,其中n.text包含子字符串'关键字'。例如。 n.text = 'This is a keyword'

为了加快这个速度,我想为每个单词创建一个索引。这是否可以使用新的Schema Indexes

(或者这可以使用legacy index并将每个节点添加到此索引但我更喜欢使用模式索引来完成

2 个答案:

答案 0 :(得分:3)

绝对。鉴于您正在寻找完全匹配,您可以使用模式索引。从您的问题判断,您可能知道这一点,但要创建索引,您需要为节点分配一个标签,然后在该标签上创建索引。

CREATE INDEX ON :MyLabel(text)

然后在查询时,密码执行索引将自动使用此索引和以下查询

MATCH (n:MyLabel { text : 'keyword' })
RETURN n

这将使用模式索引来查找标记为MyLabel的节点和具有值text的属性keyword。请注意,这与属性的完整值完全匹配。

要强制Neo4j使用特定索引,您可以使用index hints

MATCH (n:MyLabel)
USING INDEX n:MyLabel(text)
WHERE n.text = 'keyword'
RETURN n

修改

在重新阅读您的问题时,我认为您实际上并不是在寻找完全匹配,但实际上希望在keyword参数 text内完全匹配领域。如果是,那么......不,你还不能使用模式索引。在Neo4j手册中引用Use index with STARTS WITH

  

目前无法使用索引解决类似的运算符ENDS WITH和CONTAINS。

答案 1 :(得分:2)

如果我正确理解您的问题,遗留索引将完全符合您的目标。如果您不想为您创建/删除/更新的每个节点维护索引,则可以使用自动索引(http://jexp.de/blog/2014/03/full-text-indexing-fts-in-neo4j-2-0/)。

如果您希望仅使用架构索引,则另一种方法是将每个关键字存储为单独的节点。然后,您可以使用模式索引查找相关的关键字节点,然后映射到它们所在的节点。只是一个想法。