Neo4j 自动索引、遗留索引和标签模式 : differences for a relative-to-a-node full-text search

标签 neo4j lucene full-text-search label full-text-indexing

这个问题在 neo4j-legacy-indexes-and-auto-index-vs-new-label-bases-schema-indexesthe-difference-between-legacy-indexing-auto-indexing-and-the-new-indexing-approach

我还不能对它们发表评论并在这里写一个新线程。 在我的数据库中,我有一个遗留索引“主题”和标签“主题”。

我知道:

  • 一个。 pattern MATCH (n:Label) 将扫描节点;
  • b。 pattern START (n:Index) 将搜索遗留索引
  • c。 auto-index 是一种遗留索引,应该给出与 (b) 相同的结果,但在我的情况下不是
  • d。对于“良好做法”,START 子句应替换为 MATCH。

我在 a 之间有不一致的结果。和 b。 (见下文),无法弄清楚如何使用 MATCH 的正确语法来搜索标签的索引。

这里有一些例子:

1#

start n=node:topic('name:(keyword1 AND keyword2)') return n

6 行,3 毫秒

start n=node:node_auto_index('name:(keyword1 AND keyword2)') return n;

0 行

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.AND.*keyword2*.' return n;

0 行,10K 毫秒

2#

start n=node:topic('name:(keyword1)') return n

212 行,122 毫秒 [所有包含子字符串关键字 1 的连贯结果]

start n=node:node_auto_index('name:(keyword1)') return n

0 行

MATCH (n:Topic) where n.name =~ '(?i).*keyword1*.'return n

835 行,8K 毫秒 [结果也不连贯,包含子字符串 关键字]

MATCH (n:Topic) where n.name =~ 'keyword1' return n;

1 行,>6K 毫秒 [完全匹配]

MATCH (n:topic) where n.name =~ 'keyword1' return n;

没有结果(这里我使用的是索引“主题”而不是标签“主题”!)

MATCH (node:topic) where node.name =~ 'keyword1' return node;

无结果(尝试直接使用节点“object”,如自动索引语法)

你能帮忙解释一下吗:

  • 遗留索引和自动索引之间有什么区别,为什么两者之间的结果不一致?

  • 如何将 MATCH 子句与索引而不是标签一起使用? 我想重现全文搜索的结果。

  • 执行全文搜索的哪种语法仅适用于节点的邻居,而不适用于全数据库?比赛 ?开始条款?遗留索引?标签?我很困惑。

最佳答案

自动索引(只有一个)是一个名为 node_auto_index 的手动(也称为遗留)索引。这个特殊的索引通过连接到事务处理来跟踪图形的变化。因此,如果您将 name 声明为配置中节点的自动索引的一部分,则对具有 name 属性的节点的任何更改都会反射(reflect)到该索引。

请注意,当您添加例如用于自动索引的新属性。

请进一步注意,手动或自动索引完全独立于标签。

查询手动或自动索引的唯一方法是使用 START 子句:

START n=node:<indexName>(<lucene query expression>) // index query
START n=node:<indexName>(key='<value>') // exact index lookup

模式索引完全不同,并在适当的时候用在 MATCH 中。

A blog post of mine涵盖了 neo4j 的所有索引功能。

通常,您在图形数据库中使用索引来标识遍历的起点。在图表中获得引用后,您只需遵循关系即可,不再进行索引查找。

有关全文索引,请参阅 another blog post .

根据以下评论更新

事实上 MATCH (p:Topic {name: 'DNA'}) RETURN pMATCH (n:Topic) where n.name = 'DNA' return n 两者是等价的。两者都会产生相同的查询计划。如果标签 Topic 和属性 name 上有模式索引(通过 CREATE INDEX ON :Topic(name)),Cypher 将隐式使用该模式索引以查找指定的节点。

目前您不能使用基于模式索引的全文搜索。全文仅在手动/自动索引中可用。

您随 START n=node:topic(...) 提供的所有示例都依赖于手动索引。您有责任使它们与您的图表内容保持同步,因此我假设差异是由于图表中的不一致修​​改造成的,而不是反射(reflect)对手动索引的更改。

在任何情况下,如果您使用 START n=node:topic(....) 将永远不会使用架构索引。

关于Neo4j 自动索引、遗留索引和标签模式 : differences for a relative-to-a-node full-text search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770466/

相关文章:

database - "every mutating transaction must be performed in a transaction"对数据库意味着什么?

neo4j - 仅将 Neo4J 中的完整路径与 Cypher 匹配(不是子路径)

hibernate - 什么是Grails最好的搜索插件?

java - 使用 Mahout 进行全文个性化搜索

full-text-search - 无法在 lucene 索引中搜索所有生成的术语

sql-server-2008 - 搜索和排名短语(例如电影标题)

java - Neo4j 中的错误需要帮助

java - Neo4j Spring Data 示例缺少注释 @Indexed

java - 对来自 Lucene 索引的结果进行分类

php - 如何改进全文搜索的 mysql 查询?