【问题标题】:Optimizing neo4j lucene index优化 neo4j lucene 索引
【发布时间】:2015-06-20 07:10:27
【问题描述】:

我在我的 Neo4j 数据库中设置了全文自动索引。

需要明确的是,在这种情况下,Neo4j 总是使用 Lucene 来做索引。 我目前有大约 2000 万个节点,并且可能很快会增加到超过 4000 万个节点。

对于大多数查询,性能都很好,几乎是即时的,但有时像

这样的查询
"*term*" 

最多需要 20 秒才能返回。

您能否分享一些关于优化 Neo4j 和 Lucene 以执行更快的全文搜索的技巧?也许我应该修改一些缓存属性?

文档中对基本配置进行了很好的解释,但很难找到任何关于如何在 Neo4j 中配置和/或更改 Lucene 行为的编写良好的指南。

【问题讨论】:

  • 也许你可以分享你的数据模型和查询/代码?

标签: optimization indexing lucene neo4j full-text-search


【解决方案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]

这样的查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多