元数据过滤
本页详细介绍了如何在查询时应用元数据过滤器。
当您将文档索引到文档存储中时,您可以为其附加元数据。一个例子是DocumentLanguageClassifier,它会将文档内容的语言添加到其元数据中。像MetadataRouter 这样的组件随后可以根据其元数据路由文档。
然后,您可以使用元数据过滤搜索查询,从而根据特定条件缩小结果范围。这确保了您的检索器可以从最相关的数据子集中获取答案。
为了说明元数据过滤器的工作原理,想象一下您拥有一系列不同公司的年度报告。您可能只想搜索特定年份以及一小部分公司。这可以减少检索器的工作量,并确保您获得更相关的结果。
过滤类型
过滤器被定义为字典或嵌套字典,可以是两种类型:比较或逻辑。
比较
比较运算符有助于根据指定条件搜索元数据字段。
比较字典必须包含以下键
-field:文档的元字段之一的名称,例如meta.years.
-operator:必须是以下之一
- `==`
- `!=`
- `>`
- `>=`
- `<`
- `<=`
- `in`
- `not in`
可用的比较运算符可能因特定的文档存储集成而异。例如,
ChromaDocumentStore支持两个额外的运算符contains和not contains。有关支持的过滤器的详细信息,请参阅特定集成的 API 参考。
-value:接受单个值或(在“in”和“not in”的情况下)值列表。
示例
以下是一个简单的字典形式的过滤器的示例。该过滤器在文档的type 元字段中选择分类为“article”的文档
filters = {"field": "meta.type", "operator": "==", "value": "article"}
逻辑
逻辑运算符可用于创建嵌套字典,允许您应用多个fields 作为过滤条件。逻辑字典必须包含以下键
-operator:通常是以下之一
- `NOT`
- `OR`
- `AND`
可用的逻辑运算符可能因特定的文档存储集成而异。例如,
ChromaDocumentStore不支持NOT运算符。有关支持的过滤器的详细信息,请参阅特定集成的 API 参考。
-conditions:必须是字典列表,类型为比较或逻辑。
嵌套过滤器示例
这是一个更复杂的过滤器,它结合使用比较和逻辑来查找文档,其中
- 元字段
type是“article”, - 元字段
date是在 1420066800 和 1609455600 之间(特定日期范围), - 元字段
rating大于或等于 3, - 文档要么分类为
genre["economy", "politics"]OR元字段publisher是“nytimes”。
filters = {
"operator": "AND",
"conditions": [
{"field": "meta.type", "operator": "==", "value": "article"},
{"field": "meta.date", "operator": ">=", "value": 1420066800},
{"field": "meta.date", "operator": "<", "value": 1609455600},
{"field": "meta.rating", "operator": ">=", "value": 3},
{
"operator": "OR",
"conditions": [
{"field": "meta.genre", "operator": "in", "value": ["economy", "politics"]},
{"field": "meta.publisher", "operator": "==", "value": "nytimes"},
],
},
],
}
过滤器用法
过滤器可以通过Retriever 类应用,也可以直接在文档存储中应用。
在Retriever 类中,过滤器通过filters 参数传递。在使用管道时,可以将过滤器提供给Pipeline.run(),它会自动将它们路由到Retriever 类(有关使用管道的更多信息,请参阅管道文档)。
下面的示例显示了如何将过滤器传递给管道中的检索器
pipeline.run(
data={"retriever": {
"query": "Why did the revenue increase?",
"filters": { "operator": "AND",
"conditions": [
{"field": "meta.years", "operator": "==", "value": "2019"},
{"field": "meta.companies", "operator": "in", "value": ["BMW", "Mercedes"]},
]
}
}
}
)
在文档存储中,使用filter_documents 方法将过滤器应用于存储的文档,前提是特定集成支持过滤。
下面的示例显示了如何将过滤器传递给QdrantDocumentStore:
filters = {
"operator": "AND",
"conditions": [
{"field": "meta.type", "operator": "==", "value": "article"},
{"field": "meta.genre", "operator": "in", "value": ["economy", "politics"]},
],
}
results = QdrantDocumentStore.filter_documents(filters=filters)
其他参考资料
📓 教程:使用元数据过滤文档
🧑🍳 食谱:从用户查询中提取元数据过滤器
更新于 7 个月前
