索引配置

本页介绍了如何配置 Neo4j 索引以提升搜索性能并启用全文搜索。支持的索引类型包括:

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

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

当您编写 Cypher 查询时,无需指定使用哪些索引。Cypher 的查询规划器会自动决定使用哪些可用索引。

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

索引类型可根据下表进行识别:

索引类型 Cypher 命令 核心 API

范围索引 (Range index)

SHOW RANGE INDEXES

org.neo4j.graphdb.schema.IndexType#RANGE

空间点索引 (Point index)

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

您不能在相同的属性上创建相同类型的多个索引。

范围索引 (Range indexes)

范围索引可用于所有类型值的精确查找、范围扫描、全表扫描以及前缀搜索。

范围索引是属性索引中最通用的类型,因为它们支持所有值类型及广泛的操作。

键大小限制

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

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

解决限制的方法

由于文本索引的键大小限制约为 32kB,因此可以通过使用文本索引来规避范围索引的键大小限制。然而,文本索引不像范围索引那样是通用索引,因此该方法不能应用于所有情况。有关更多信息,请参阅 文本索引

点索引 (Point indexes)

点索引是一种高度专业化的单属性索引,与范围索引不同,它们仅索引包含 Point 值(点值)的属性。

点索引旨在加速空间查询,特别是 distance(距离)和 bounding box(边界框)查询。精确查找是该索引类型支持的唯一非空间查询。

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

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

文本索引 (Text indexes)

文本索引是一种单属性索引类型。与范围索引不同,文本索引仅对包含字符串值的属性进行索引。

文本索引专门用于高效处理 ENDS WITHCONTAINS 查询。它们通过 Cypher 使用,并且支持较小范围的字符串查询。尽管文本索引确实支持其他文本查询,但 ENDS WITHCONTAINS 是此索引类型相较于范围索引具有优势的唯一查询类型。

默认提供程序是 text-2.0

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

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

限制

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

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

全文索引 (Full-text indexes)

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

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

全文索引的一个使用案例示例是解析书籍以查找特定术语,并利用该书籍是用特定语言编写的信息。为该语言使用 分析器 可以排除停用词(如 "if""and"),并包含各种词形。

另一个使用案例示例是索引电子邮件语料库中的各个地址字段和文本数据。使用 email 分析器,您可以找到所有由特定电子邮件帐户发送/接收或提及该帐户的电子邮件。

与范围索引和文本索引不同,全文索引使用内置过程进行查询。但它们仍通过 Cypher 创建和删除。使用全文索引需要熟悉这些索引的操作方式。

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

配置全文索引

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

db.index.fulltext.default_analyzer

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

db.index.fulltext.eventually_consistent

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

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

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

db.index.fulltext.eventually_consistent_index_update_queue_max_length

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

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

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

选择分析器

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

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

默认情况下,分析器会分析索引值和查询字符串。但在某些情况下,为索引值和查询字符串使用不同的分析器更为合适。您可以通过在使用全文搜索过程时为查询字符串指定分析器来做到这一点。

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

属性级分析器

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

令牌查找索引 (Token lookup indexes)

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

使用与重要性

令牌查找索引是最重要的索引,因为它们极大地加速了其他索引的填充。它们对于 Cypher 查询执行和核心 API 操作也至关重要。因此,删除它们时应谨慎考虑。

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

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

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

4.3 版本之前创建的数据库

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

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

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