索引配置
此页面描述了如何配置 Neo4j 索引以增强搜索性能并启用全文搜索。支持的索引类型包括
可以使用 Cypher 创建和删除所有类型的索引,并且它们都可以用于索引节点和关系。令牌查找索引是数据库中默认存在的唯一索引。
范围、点、文本和全文索引提供从属性值到实体(节点或关系)的映射。令牌查找索引有所不同,它提供从标签到节点或关系类型到关系的映射,而不是在属性和实体之间。
编写 Cypher 查询时,无需指定要使用的索引。Cypher 的查询计划程序会决定要使用哪些可用的索引。
本页的其余部分提供了有关可用索引及其配置方面的信息。有关创建、查询和删除索引的更多详细信息,请参阅Cypher 手册 → 用于搜索性能的索引和Cypher 手册 → 用于支持全文搜索的索引。
索引的类型可以根据下表确定
索引类型 | Cypher 命令 | 核心 API |
---|---|---|
范围索引 |
|
|
点索引 |
|
|
文本索引 |
|
|
全文索引 |
|
|
令牌查找索引 |
|
|
向量索引 |
|
|
您不能对同一属性使用相同类型的索引。 |
范围索引
范围索引可用于对所有类型的值进行精确查找、范围扫描、完整扫描和前缀搜索。
范围索引是用途最广泛的属性索引,因为它支持所有值类型和各种操作。
解决限制的变通方法
由于文本索引的键大小限制约为 32kB,因此可以通过使用文本索引来解决范围索引的键大小限制。但是,文本索引不是像范围索引那样的通用索引,因此此变通方法并非适用于所有情况。有关更多信息,请参阅文本索引。
点索引
点索引是一种高度专业化的单属性索引,与范围索引不同,它们仅索引具有点值的属性。
点索引旨在加快空间查询的速度,特别是distance
和bounding box
查询。精确查找是此索引类型支持的唯一非空间查询。
有关点索引可用于的查询的更多信息,请参阅Cypher 手册 → 查询调优 → 索引的使用。
点索引可以选择接受用于调整空间搜索行为的配置属性。有关配置点索引的更多信息,请参阅Cypher 手册 → 用于搜索性能的索引。
文本索引
文本索引是一种单属性索引。与范围索引不同,文本索引仅索引具有字符串值的属性。
文本索引专门设计用于有效处理ENDS WITH
或CONTAINS
查询。它们通过 Cypher 使用,并且支持较小的字符串查询集。即使文本索引确实支持其他文本查询,ENDS WITH
或CONTAINS
查询也是此索引类型相对于范围索引提供优势的唯一查询。
有关文本索引可用于的查询的更多信息,请参阅Cypher 手册 → 查询调优 → 索引的使用。
有关不同索引类型的更多信息,请参阅Cypher 手册 → 用于搜索性能的索引。
Neo4j 5.1 引入了改进的索引提供程序 |
全文索引
全文索引针对文本的索引和搜索进行了优化。
即使文本索引和全文索引似乎解决了非常相似的问题,但它们之间也存在本质区别。与仅索引单个属性字符串的文本索引不同,全文索引可以索引任何类型的字符串数据。文本索引根据 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 官方文档。
令牌查找索引
令牌查找索引用于查找具有特定标签的节点或特定类型的关系。它们始终在所有标签或关系类型上创建。因此,数据库最多可以有两个令牌查找索引 - 一个用于节点,一个用于关系。