索引配置

此页面描述了如何配置 Neo4j 索引以增强搜索性能并启用全文搜索。支持的索引类型包括

可以使用 Cypher 创建和删除所有类型的索引,并且它们都可以用于索引节点和关系。令牌查找索引是数据库中默认存在的唯一索引。

范围、点、文本和全文索引提供从属性值到实体(节点或关系)的映射。令牌查找索引有所不同,它提供从标签到节点或关系类型到关系的映射,而不是在属性和实体之间。

编写 Cypher 查询时,无需指定要使用的索引。Cypher 的查询计划程序会决定要使用哪些可用的索引。

本页的其余部分提供了有关可用索引及其配置方面的信息。有关创建、查询和删除索引的更多详细信息,请参阅Cypher 手册 → 用于搜索性能的索引Cypher 手册 → 用于支持全文搜索的索引

索引的类型可以根据下表确定

索引类型 Cypher 命令 核心 API

范围索引

SHOW RANGE INDEXES

org.neo4j.graphdb.schema.IndexType#RANGE

点索引

SHOW POINT INDEXES

org.neo4j.graphdb.schema.IndexType#POINT

文本索引

SHOW TEXT INDEXES

org.neo4j.graphdb.schema.IndexType#TEXT

全文索引

SHOW FULLTEXT INDEXES

org.neo4j.graphdb.schema.IndexType#FULLTEXT

令牌查找索引

SHOW LOOKUP INDEXES

org.neo4j.graphdb.schema.IndexType#LOOKUP

向量索引

SHOW VECTOR INDEXES

org.neo4j.graphdb.schema.IndexType#VECTOR

您不能对同一属性使用相同类型的索引。

范围索引

范围索引可用于对所有类型的值进行精确查找、范围扫描、完整扫描和前缀搜索。

范围索引是用途最广泛的属性索引,因为它支持所有值类型和各种操作。

键大小限制

范围索引的键大小限制约为 8kB。

如果事务达到一个或多个更改的键大小限制,则该事务在提交任何更改之前失败。如果在索引填充期间达到限制,则生成的索引将处于失败状态,因此无法用于任何查询。

解决限制的变通方法

由于文本索引的键大小限制约为 32kB,因此可以通过使用文本索引来解决范围索引的键大小限制。但是,文本索引不是像范围索引那样的通用索引,因此此变通方法并非适用于所有情况。有关更多信息,请参阅文本索引

点索引

点索引是一种高度专业化的单属性索引,与范围索引不同,它们仅索引具有点值的属性。

点索引旨在加快空间查询的速度,特别是distancebounding box查询。精确查找是此索引类型支持的唯一非空间查询。

有关点索引可用于的查询的更多信息,请参阅Cypher 手册 → 查询调优 → 索引的使用

点索引可以选择接受用于调整空间搜索行为的配置属性。有关配置点索引的更多信息,请参阅Cypher 手册 → 用于搜索性能的索引

文本索引

文本索引是一种单属性索引。与范围索引不同,文本索引仅索引具有字符串值的属性。

文本索引专门设计用于有效处理ENDS WITHCONTAINS查询。它们通过 Cypher 使用,并且支持较小的字符串查询集。即使文本索引确实支持其他文本查询,ENDS WITHCONTAINS查询也是此索引类型相对于范围索引提供优势的唯一查询。

有关文本索引可用于的查询的更多信息,请参阅Cypher 手册 → 查询调优 → 索引的使用

有关不同索引类型的更多信息,请参阅Cypher 手册 → 用于搜索性能的索引

Neo4j 5.1 引入了改进的索引提供程序text-2.0,其性能明显更好。新的文本索引默认将使用text-2.0提供程序。现有索引将继续使用text-1.0。您必须重新创建这些索引才能从此改进中受益。

限制

文本索引仅索引单个属性字符串。

索引对单个属性字符串的键大小限制约为 32kB。如果事务达到一个或多个更改的键大小限制,则该事务在提交任何更改之前失败。如果在索引填充期间达到限制,则生成的索引将处于失败状态,因此无法用于任何查询。

全文索引

全文索引针对文本的索引和搜索进行了优化。

即使文本索引和全文索引似乎解决了非常相似的问题,但它们之间也存在本质区别。与仅索引单个属性字符串的文本索引不同,全文索引可以索引任何类型的字符串数据。文本索引根据 Cypher 语言定义的语义解决子字符串匹配和精确字符串匹配。而全文索引使用可插拔分析器,其中许多分析器提供特定于语言的文本处理,从而允许进行比简单子字符串匹配更复杂的查询。根据使用的分析器,全文索引可用于不同的文本搜索类型,例如精确匹配、相关性匹配、短语查询、自动完成等。此外,结果按相关性排序。

全文索引用例的一个示例是在书籍中解析某个术语并利用该书籍是用某种语言编写的知识。对该语言的分析器的使用可以排除诸如“if”“and”之类的停用词,并包含词形。

另一个用例示例是对电子邮件语料库中各种地址字段和文本数据进行索引。使用email分析器,您可以查找从/到或提及特定电子邮件帐户的所有电子邮件。

与范围索引和文本索引相比,全文索引使用内置过程进行查询。但是,它们是使用 Cypher 创建和删除的。使用全文索引确实需要熟悉这些索引的运行方式。

全文索引由Apache Lucene索引和搜索库提供支持。有关如何创建和使用全文索引的完整说明,请参阅Cypher 手册 → 用于支持全文搜索的索引

配置全文索引

以下选项可用于配置全文索引。有关 Neo4j 过程的完整列表,请参阅[reference/procedures/]

db.index.fulltext.default_analyzer

创建新的全文索引时的默认分析器名称。创建后,索引的分析器不受此设置的影响。

db.index.fulltext.eventually_consistent

创建新的全文索引时的默认一致性模型。创建后,索引的一致性模型不受此设置的影响。

索引通常是完全一致的,事务的提交不会返回,直到存储和索引都更新为止。另一方面,最终一致的全文索引不会作为提交的一部分进行更新,而是将其更新排队并在后台线程中应用。这意味着在提交更改和通过任何最终一致的全文索引使该更改可见之间可能会有短暂的延迟。此延迟只是排队的产物,通常相对较小,因为最终一致的索引会“尽快”更新。

默认情况下,此功能处于关闭状态,全文索引是完全一致的。

db.index.fulltext.eventually_consistent_index_update_queue_max_length

最终,一致的全文索引将其更新排队并在后台线程中应用,此设置确定该更新队列的最大大小。如果达到最大队列大小,则提交的事务将阻塞并等待,直到队列中有更多空间,然后再向其中添加更多更新。

此设置适用于所有最终一致的全文索引,它们都使用相同的队列。由于堆空间使用方面的考虑,最大队列长度必须至少为 1 个索引更新,最多为 5000 万。

默认最大队列长度为 10,000 个索引更新。

选择分析器

默认情况下,全文索引使用db.index.fulltext.default_analyzer配置设置中指定的standard-no-stop-words分析器。此分析器与 Lucene 的StandardAnalyzer相同,只是没有过滤掉停用词。

要指定另一个分析器,请使用全文索引创建命令的OPTIONS子句。所有可能的分析器的列表可以通过db.index.fulltext.listAvailableAnalyzers() Cypher 过程获得。

默认情况下,分析器会分析索引值和查询字符串。但是,在某些情况下,对索引值和查询字符串使用不同的分析器更合适。您可以在使用全文搜索过程时为查询字符串指定分析器来执行此操作。

有关如何创建和使用全文索引的详细信息,请参阅Cypher 手册 → 用于支持全文搜索的索引

每个属性的分析器

可以在多个属性上创建全文索引。如果需要对不同属性使用不同的分析器,则 Lucene 中的标准方法是创建自定义复合分析器。Lucene 项目提供了PerFieldAnalyzerWrapper,它可以将分析器与特定字段关联。有关更多信息,请参阅Lucene 官方文档

令牌查找索引

令牌查找索引用于查找具有特定标签的节点或特定类型的关系。它们始终在所有标签或关系类型上创建。因此,数据库最多可以有两个令牌查找索引 - 一个用于节点,一个用于关系。

用途和重要性

令牌查找索引是最重要的索引,因为它们可以显着加快其他索引的填充速度。它们对于 Cypher 查询执行和核心 API 操作也至关重要。因此,应仔细考虑是否删除它们。

节点标签查找索引对于通过一个或多个标签匹配节点的查询非常重要。当没有合适的索引可用时,它也可用于匹配节点的标签和属性。同样,关系类型查找索引对于通过其类型匹配关系的查询非常重要。

大多数查询都是通过匹配节点并扩展其关系来执行的。因此,节点标签查找索引比关系类型查找索引略显重要。

在 4.3 及更高版本中创建的所有数据库中,默认情况下都存在节点和关系类型查找索引。

4.3 之前创建的数据库

为了保持此类数据库的后向兼容性和性能特征,在 4.3 之前创建的数据库不会自动获得关系查找索引。

如果需要,可以通过 Cypher 显式创建关系类型查找索引来获取此类数据库。

在大型数据库上创建关系类型查找索引可能需要大量时间,因为在填充此类索引时需要扫描所有关系。