要在 Haystack 查询中实现高级过滤,您可以使用 Filter
类或字典来定义缩小搜索结果范围的条件。 Haystack 的过滤系统与 Elasticsearch、OpenSearch 或 Weaviate 等文档存储一起使用,允许您在文档元数据上指定逻辑条件。例如,要过滤 category
字段等于“news”的文档,您将创建一个如下的过滤器:{"field": "category", "operator": "==", "value": "news"}
。 这些过滤器可以传递给检索器或管道,以编程方式约束搜索结果。
当使用 AND
、OR
和 NOT
等逻辑运算符组合多个条件时,高级过滤变得非常强大。 例如,要查找 category
为“tech”且 publish_date
在 2023 年之后的文档,您将构建一个嵌套过滤器
{
"operator": "AND",
"conditions": [
{"field": "category", "operator": "==", "value": "tech"},
{"field": "publish_date", "operator": ">", "value": "2023-01-01"}
]
}
您还可以对数字或日期字段使用比较运算符,例如 >
、<
、>=
和 <=
。 对于 IN
操作(例如,categories in ["science", “history”]),请使用 {"field": "category", "operator": "in", "value": ["science", "history"]}
。 大多数文档存储原生支持这些操作,但不同后端之间的语法可能略有不同。
要将过滤集成到 Haystack 管道中,请将过滤器传递给检索器的 retrieve()
方法或管道的 run()
方法中的 filters
参数。 例如
from haystack import Pipeline
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
pipeline = Pipeline()
pipeline.add_component("retriever", InMemoryBM25Retriever(document_store))
result = pipeline.run(
data={"retriever": {"query": "AI trends", "filters": {"category": "tech"}}}
)
如果使用 Elasticsearch,可以通过制作符合其语法的过滤器来利用其 DSL 进行地理查询或正则表达式模式。 始终使用特定的文档存储测试过滤器,因为不支持的操作(例如,FAISS 中的模糊匹配)可能会导致错误。 对于复杂的用例,将过滤器与 Haystack 的查询构建器或自定义预处理相结合,以确保兼容性。