Haystack 通过结合文档处理、索引和查询管道来处理全文搜索,从而实现高效的基于文本的检索。其核心在于,Haystack 依赖于倒排索引——一种将术语(如单词或短语)映射到包含这些术语的文档的数据结构。这些索引通常由集成的搜索引擎管理,如 Elasticsearch、OpenSearch,或具有全文扩展的数据库,如 SQLite 或 PostgreSQL。例如,当一个文档被添加到 Haystack 时,它会被分割成更小的文本单元(例如段落),进行分词,然后进行索引。这使得系统能够通过扫描索引而不是重复解析原始文本文件来快速定位匹配用户查询的文档。
Haystack 中的文档处理包括几个步骤来准备文本进行搜索。首先,将 PDF、Word 文档或 HTML 等格式的文件使用内置转换器(例如 PDFToTextConverter
)转换为纯文本。然后,使用分割器将文本分割成可管理的块,以确保保留上下文。应用分词和规范化(例如小写化、移除停用词)来标准化术语。例如,一个 100 页的 PDF 可以被分割成 500 个文本块,每个块都带有元数据(如源文件名和位置)进行索引。这种结构化的方法确保了高效的存储和检索,即使对于大型数据集也是如此。开发人员可以自定义预处理步骤,例如添加自定义过滤器或使用特定语言的词干提取器,以提高相关性。
在处理查询时,Haystack 会对搜索词进行与索引时相同的分词和规范化步骤。然后,系统会扫描倒排索引以查找包含查询词的文档,使用 BM25 等算法(用于基于关键词的搜索)或应用语义相似性模型(例如 transformers)对它们进行排名。例如,如果启用了语义搜索,搜索“machine learning frameworks”(机器学习框架)可能会返回包含“TensorFlow”或“PyTorch”等术语的文档。Haystack 的管道允许开发人员结合关键词和基于向量的检索,应用过滤器(例如日期范围),或重新排序结果。这种灵活性确保了即使对于跨数百万文档的复杂查询,也能在保持性能的同时获得精确的结果。