文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

元数据过滤

本页详细介绍了如何在查询时应用元数据过滤器。

当您将文档索引到文档存储中时,您可以为其附加元数据。一个例子是DocumentLanguageClassifier,它会将文档内容的语言添加到其元数据中。像MetadataRouter 这样的组件随后可以根据其元数据路由文档。

然后,您可以使用元数据过滤搜索查询,从而根据特定条件缩小结果范围。这确保了您的检索器可以从最相关的数据子集中获取答案。

为了说明元数据过滤器的工作原理,想象一下您拥有一系列不同公司的年度报告。您可能只想搜索特定年份以及一小部分公司。这可以减少检索器的工作量,并确保您获得更相关的结果。

过滤类型

过滤器被定义为字典或嵌套字典,可以是两种类型:比较或逻辑。

比较

比较运算符有助于根据指定条件搜索元数据字段。

比较字典必须包含以下键

-field:文档的元字段之一的名称,例如meta.years.

-operator:必须是以下之一

    - `==`
    - `!=`
    - `>`
    - `>=`
    - `<`
    - `<=`
    - `in`
    - `not in`

📘

可用的比较运算符可能因特定的文档存储集成而异。例如,ChromaDocumentStore 支持两个额外的运算符containsnot 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)

其他参考资料

📓 教程:使用元数据过滤文档

🧑‍🍳 食谱:从用户查询中提取元数据过滤器