我在Neo4j数据库中设置了全文自动索引。
很明显,在这种情况下,Neo4j总是使用Lucene来做索引。 目前我有大约2000万个节点,可能很快会增加到超过4000万个节点。
对于大多数查询,性能很好,几乎是即时的,但有时候会像
那样查询"*term*"
最多需要20秒才能返回。
您能否分享一些有关优化Neo4j和Lucene以执行更快全文搜索的技巧?也许我应该修改一些缓存属性?
基本配置在文档中得到了很好的解释,但很难找到任何关于如何配置和/或改变Lucene在Neo4j中的行为的精心编写的指南。
答案 0 :(得分:1)
我认为你的主要问题是你在那里使用领先的通配符。 See other answers about lucene performance in general on leading wildcards
如果您只是在寻找一个简单的术语,您可能希望从文档中提取术语并将它们链接到该术语的单独节点,以便您可以利用图形连接来获取包含术语的文档。
无论您如何构建索引,此查询“ term ”都必须查看数据库中每个字符串的每个可能子字符串,这将花费很长时间。
您可能需要查看对文档进行标记并提取这些关键术语,以便最终得到类似的内容:
(d:Document)-[:contains]->(t:Term { term: "foo" });
然后,当你想知道哪些文件中有“foo”时,你不再做Lucene,但是这个:
MATCH (t:Term {term: "foo"})<-[:contains]-(d:Document)
RETURN d;
我希望这会更快,更快,但需要你在前端进行术语提取。它也主要用于简单的术语,而不是像[foo?o?o?bar]
这样的查询