倒排索引
倒排索引 将值(如单词或数字)映射到包含这些值的对象。它是所有基于属性的过滤(where 过滤器)和关键字搜索(bm25、hybrid)的基础。
倒排索引类型
Weaviate 中有多种 倒排索引类型 可用。并非所有倒排索引类型都适用于所有数据类型。可用的倒排索引类型是
| 倒排索引类型 | 描述 | 适用数据类型 | 默认值 | 可用性 |
|---|---|---|---|---|
indexSearchable | 适用于 BM25 的可搜索索引,用于 BM25 或混合搜索的映射索引。 | text, text[], | true | v1.19 |
indexFilterable | 用于基于匹配的过滤的 Roaring Bitmap 索引。 | 除 blob、geoCoordinates、object 和 phoneNumber 数据类型及其数组之外的所有类型 | true | v1.19 |
indexRangeFilters | 用于基于数值范围的过滤的 Roaring Bitmap 索引。 | 仅 int、number 和 date | false | v1.26 |
- 启用
indexFilterable和indexRangeFilters中的一个或两个,以索引属性以加快过滤速度。- 如果仅启用一个,则将使用相应的索引进行过滤。
- 如果同时启用两个,则
indexRangeFilters用于涉及比较运算符的操作,而indexFilterable用于相等和不等操作。
倒排索引参数
这些参数在集合定义中的 invertedIndexConfig 对象内设置。
| 参数 | 类型 | 默认值 | Details |
|---|---|---|---|
bm25 | 对象 | { "k1": 1.2, "b": 0.75 } | 设置 BM25 排名算法的 k1 和 b 参数。可以在属性级别覆盖。请参阅下面的 BM25 配置。 |
stopwords | 对象 | (不确定) | 定义停用词列表,以排除搜索查询中的常见词。请参阅下面的 停用词配置。 |
indexTimestamps | 布尔值 | false | 如果为 true,则索引对象创建和更新时间戳,从而能够按 creationTimeUnix 和 lastUpdateTimeUnix 进行过滤。 |
indexNullState | 布尔值 | false | 如果为 true,则索引每个属性的空/非空状态,从而能够过滤 null 值。 |
indexPropertyLength | 布尔值 | false | 如果为 true,则索引每个属性的长度,从而能够按属性长度进行过滤。 |
启用 indexTimestamps、indexNullState 或 indexPropertyLength 会增加开销,因为必须创建和维护这些额外的索引。仅在需要这些特定过滤功能时才启用它们。
代码示例
此代码示例演示如何通过客户端库配置倒排索引参数
如果某个片段无法工作或您有任何反馈,请打开一个 GitHub issue。
from weaviate.classes.config import (
Configure,
DataType,
Property,
StopwordsPreset,
Tokenization,
)
client.collections.create(
"Article",
# Additional settings not shown
properties=[ # properties configuration is optional
Property(
name="title",
data_type=DataType.TEXT,
index_filterable=True,
index_searchable=True,
tokenization=Tokenization.WORD,
),
Property(
name="chunk",
data_type=DataType.TEXT,
index_filterable=True,
index_searchable=True,
tokenization=Tokenization.FIELD,
),
Property(
name="chunk_number",
data_type=DataType.INT,
index_range_filters=True,
),
],
inverted_index_config=Configure.inverted_index( # Optional
bm25_b=0.7,
bm25_k1=1.25,
index_null_state=True,
index_property_length=True,
index_timestamps=True,
stopwords_preset=StopwordsPreset.EN,
stopwords_additions=["example", "stopword"],
stopwords_removals=["the", "and"],
),
)
bm25
invertedIndexConfig 的一部分。BM25 的设置是 自由参数 k1 和 b,它们是可选的。默认值(k1 = 1.2 和 b = 0.75)适用于大多数情况。
它们可以按集合配置,并且可以选择性地按属性覆盖。
示例 bm25 配置 - JSON 对象
包含 bm25 配置的完整集合对象的示例
{
"class": "Article",
// Configuration of the sparse index
"invertedIndexConfig": {
"bm25": {
"b": 0.75,
"k1": 1.2
}
},
"properties": [
{
"name": "title",
"description": "title of the article",
"dataType": ["text"],
// Property-level settings override the collection-level settings
"invertedIndexConfig": {
"bm25": {
"b": 0.75,
"k1": 1.2
}
},
"indexFilterable": true,
"indexSearchable": true
}
]
}
stopwords
invertedIndexConfig 的一部分。text 属性可能包含对搜索结果没有贡献的非常常见的词。忽略它们可以加快包含停用词的查询速度,因为它们也可以从查询中自动删除。对于计分搜索(如 BM25),这种加速非常明显。
停用词配置使用预设系统。您可以选择一个预设以使用特定语言最常见的停用词(例如 "en" 预设)。如果您需要更精细的控制,您可以添加其他停用词或删除您认为不应包含在列表中的停用词。或者,您可以从一个空预设("none")开始,并添加所有所需的停用词来创建自定义停用词列表。
示例 stopwords 配置 - JSON 对象
包含 stopwords 配置的完整集合对象的示例
"invertedIndexConfig": {
"stopwords": {
"preset": "en",
"additions": ["star", "nebula"],
"removals": ["a", "the"]
}
}
此配置允许按集合配置停用词。如果未设置,则这些值设置为以下默认值
| 参数 | 默认值 | 允许的值 |
|---|---|---|
"preset" | "en" | "en", "none" |
"additions" | [] | 任何自定义词列表 |
"removals" | [] | 任何自定义词列表 |
- 如果
preset为none,则集合仅使用additions列表中的停用词。 - 如果相同的项目同时包含在
additions和removals中,Weaviate 将返回错误。
从 v1.18 开始,停用词已建立索引。因此,停用词包含在倒排索引中,但不包含在分词查询中。结果是,当应用 BM25 算法时,停用词在相关性排名中被忽略,但会影响分数。
现在可以在运行时配置停用词。您可以使用 RESTful API 来 更新 索引后的停用词列表。
只有在 分词 设置为 word 时,才会删除停用词。
indexTimestamps
invertedIndexConfig 的一部分。要执行按时间戳过滤的查询,请配置目标集合以维护基于对象内部时间戳的倒排索引。目前,时间戳包括 creationTimeUnix 和 lastUpdateTimeUnix。
要配置基于时间戳的索引,请在 invertedIndexConfig 对象中将 indexTimestamps 设置为 true。
indexNullState
invertedIndexConfig 的一部分。要执行按 null 过滤的查询,请配置目标集合以维护跟踪集合中每个属性的 null 值的倒排索引。
要配置基于 null 的索引,请在 invertedIndexConfig 对象中将 indexNullState 设置为 true。
indexPropertyLength
invertedIndexConfig 的一部分。要执行按属性长度过滤的查询,请配置目标集合以维护基于属性长度的倒排索引。
要配置基于属性长度的索引,请在 invertedIndexConfig 对象中将 indexPropertyLength 设置为 true。
使用这些功能需要更多资源。这些额外的倒排索引必须为集合的整个生命周期创建和维护。
Weaviate 如何创建倒排索引
Weaviate 为每个属性和每个索引类型创建 单独的倒排索引。例如,如果您有一个同时可搜索和可过滤的 title 属性,Weaviate 将为该属性创建两个单独的倒排索引 - 一个针对搜索操作优化,另一个针对过滤操作优化。请参阅 概念:倒排索引 了解更多信息。
在集合创建后添加属性
在导入对象后添加属性可能会导致倒排索引相关行为的限制,例如按新属性的长度或空状态进行过滤。
这是因为倒排索引是在导入时构建的。如果您在导入对象后添加属性,则用于元数据(如长度或空状态)的倒排索引将不会更新以包含新属性。这意味着对于现有对象,新属性将不会被索引。这可能会导致查询时出现意外行为。
为了避免这种情况,您可以选择:
- 在导入对象之前添加属性。
- 删除集合,使用新属性重新创建它,然后重新导入数据。
我们正在开发一个重新索引 API,以便您可以在添加属性后重新索引数据。这将在未来的版本中提供。
分词如何影响倒排索引
对于 text 属性,Weaviate 首先会 分词 文本,然后再创建倒排索引条目。分词是将文本分解为可索引和搜索的单个词元(单词、短语或字符)的过程。
请参阅相关的 概念页面 以获取更多详细信息。
更多资源
- 概念:倒排索引
- 操作指南:设置倒排索引参数
- 参考:分词选项 - 了解不同的分词方法以及它们如何影响文本索引
问题和反馈
如果您有任何问题或反馈,请在 用户论坛 中告诉我们。
