索引配置

本页面介绍如何配置 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 查询是此索引类型相对于范围索引具有优势的唯一情况。

默认提供程序是 text-2.0

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

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

限制

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

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

全文索引

全文索引经过优化,用于索引和搜索文本。

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

全文索引的一个用例示例是解析一本书以查找特定术语,并利用该书以某种语言编写的知识。使用该语言的分析器可以排除停用词(例如“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 官方文档

令牌查找索引

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

用途和重要性

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

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

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

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

在 4.3 之前创建的数据库

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

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

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

© . All rights reserved.