【问题标题】:Neo4j indexes with wildcard searches on properties带有通配符搜索属性的 Neo4j 索引
【发布时间】:2016-04-17 03:45:09
【问题描述】:

我们使用的是 Neo4j Community Edition 2.3.1,并且有许多使用通配符的查询。例如,我们在几个较大的属性中搜索所有包含“汽车”一词的“用户”:个人资料和简历(即:句子或小段落)。

MATCH (user:User) 
WHERE (user.Profile =~ '(?i).* cars .*') OR (user.Bio =~ '(?i).* cars .*')
RETURN user SKIP 0 LIMIT 20;

“用户”节点的数量超过 160 万。

查询相对较慢,尽管我们知道这一点,因为 Neo4j 使用 AllNodesScan,因为属性上没有索引。我们想为此查询创建一个索引,但 Neo4j 的“新”索引不适用于通配符。

我们正在考虑将“旧”全文 Neo4j 索引与 Lucene 一起使用。 还考虑将 Bio 和 Profile 制作成带标签的节点,而不是 Properties,然后在它们上使用 Schema 索引。

我担心实现“旧版”索引,因为它们是“旧版”,我正在考虑是否可以在某个时候弃用它们。

关于提高上述通配符搜索性能的建议?

【问题讨论】:

    标签: performance indexing neo4j lucene cypher


    【解决方案1】:

    更新:建议使用 CONTAINS 但仅 STARTS WITH 当前使用架构索引。这可能会在未来的版本中改变。

    您是否尝试过使用 Neo4j 2.3 中添加的新 CONTAINS 运算符?

    MATCH (user:User) 
    WHERE user.Profile CONTAINS "cars" OR user.Bio CONTAINS "cars"
    RETURN user SKIP 0 LIMIT 20;
    

    您应该在要对其进行字符串过滤的每个 String 属性上建立一个架构索引。

    【讨论】:

      【解决方案2】:

      关于使用“CONTAINS”,它不能与Neo4j docs 中的新架构索引一起使用。不过谢谢你的建议。

      我要回答,并将其标记为“已回答”。我们的团队在 Neo4j 中实现了Legacy Indexing,它正在创造奇迹。简单查询的执行时间从约 6 秒降至

      【讨论】:

      • 哦,是的,很抱歉。显然只有 STARTS WITH 依赖于索引。这可能会在未来发生变化。我将编辑我的答案以防万一。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2018-05-12
      • 1970-01-01
      相关资源
      最近更新 更多