我们使用的是Neo4j Community 2.3.1,并且有许多使用通配符的查询。例如,我们搜索在几个较大的属性中有‘car’这个词的所有‘用户’:Profile和Bio (即句子或小段)。
MATCH (user:User)
WHERE (user.Profile =~ '(?i).* cars .*') OR (user.Bio =~ '(?i).* cars .*')
RETURN user SKIP 0 LIMIT 20;
“用户”节点的数量超过160万个。
查询相对较慢,尽管我们知道这一点,因为Neo4j使用AllNodesScan,因为属性上没有索引。我们想为这个查询创建一个索引,但是Neo4j‘新的’索引不适用于通配符。
我们正在考虑在Lucene中使用“旧”全文Neo4j索引。还考虑将Bio和Profile变成标记节点,而不是Properties,然后对它们使用Schema索引。
我关心的是实现‘遗留’索引,就像它们一样,嗯,‘遗留’,我正在考虑它们是否会在某个时候被废弃。
关于提高上述通配符搜索性能的建议?
发布于 2016-01-14 07:56:21
关于使用“CONTAINS”,它不能像Neo4j文档那样与新的架构索引一起使用。但谢谢你的建议。
我要回答,把这个标记为“回答”。我们的团队在Neo4j中实现了Neo4j,这是一个奇迹。简单查询的执行时间从大约6秒缩短到<100 to。
发布于 2016-01-12 05:44:08
UPDATE:建议使用schema,但只从当前使用模式索引开始。在未来的版本中,这种情况可能会改变。
您试过使用在CONTAINS
2.3中添加的新Neo4j运算符吗?
MATCH (user:User)
WHERE user.Profile CONTAINS "cars" OR user.Bio CONTAINS "cars"
RETURN user SKIP 0 LIMIT 20;
应该对要对其进行字符串筛选的每个字符串属性都设置架构索引。
https://stackoverflow.com/questions/34745157
复制相似问题