> ## Documentation Index
> Fetch the complete documentation index at: https://ikun.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 混合搜索- 结合关键字和向量搜索

> 了解混合搜索及其在结合关键字和向量搜索以获得更好结果方面的优势。

借助混合搜索，您可以获得精确匹配的精确度以及语义理解的智能性。在许多情况下，结合这两种方法将提供更全面、更相关结果。

## 究竟什么是混合搜索？

**混合搜索**是一种检索技术，它结合了**向量搜索**（语义搜索）和**关键字搜索**（词汇搜索）的优点，以查找查询最相关结果。

* 向量搜索使用嵌入（密集向量）来捕获文本的语义含义，使系统能够找到意义上相似的结果，即使确切的单词不匹配。
* 关键字搜索（BM25、TF-IDF 等）根据查询中确切单词或短语的出现频率进行匹配。

混合搜索结合了这些方法，通常通过对两种方法的结果进行评分和/或排名来实现，以最大化精确度和召回率。

## 关键字搜索 vs 向量搜索 vs 混合搜索

| 特征   | 关键字搜索                           | 向量搜索                                      | 混合搜索          |
| ---- | ------------------------------- | ----------------------------------------- | ------------- |
| 基于   | 词汇匹配 (BM25, TF-IDF)             | 嵌入相似度 (余弦, 点积)                            | 两者都有          |
| 优势   | 精确匹配，相关性                        | 上下文含义                                     | 相关性 + 含义的均衡   |
| 劣势   | 无语义理解                           | 错过精确关键字                                   | 计算量略大         |
| 示例匹配 | "chicken soup" = *chicken soup* | "chicken soup" = *hot broth with chicken* | 字面意思和相关概念都匹配  |
| 最佳用例 | 法律文档，结构化数据                      | 聊天机器人，问答，语义搜索                             | 多模态，真实的混乱用户查询 |

<Note>
  为什么混合搜索可能更适合您的应用-

  * **提高召回率**: 捕获纯关键字或向量搜索遗漏的更多相关结果。
  * **平衡的精确度**: 精确匹配获得优先，同时也包括语义上相关的结果。
  * **对歧义具有鲁棒性**: 处理拼写变体、同义词和模糊的用户意图。
  * **两全其美**: 关键字在应该的时候起作用，含义在需要的时候起作用。

  **非常适合**食谱搜索、客户支持、法律发现等**真实应用**。
</Note>

## Agno 中支持混合搜索的 Vector DB

以下向量数据库通过原生支持或配置支持混合搜索：

| 数据库        | 混合搜索支持                    |
| ---------- | ------------------------- |
| `pgvector` | ✅ 是                       |
| `milvus`   | ✅ 是                       |
| `lancedb`  | ✅ 是                       |
| `qdrantdb` | ✅ 是                       |
| `weaviate` | ✅ 是                       |
| `mongodb`  | ✅ 是 (Atlas Vector Search) |

***

## 示例：使用 `pgvector` 进行混合搜索

```python theme={null}
from agno.knowledge.pdf_url import PDFUrlKnowledgeBase
from agno.vectordb.pgvector import PgVector, SearchType

# 数据库 URL
db_url = "postgresql+psycopg://ai:ai@localhost:5532/ai"

# 初始化混合向量数据库
hybrid_db = PgVector(
    table_name="recipes",
    db_url=db_url,
    search_type=SearchType.hybrid  # 混合搜索
)

# 使用混合搜索加载 PDF 知识库
knowledge_base = PDFUrlKnowledgeBase(
    urls=["https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"],
    vector_db=hybrid_db,
)

# 将数据加载到数据库中（首次设置）
knowledge_base.load(recreate=True, upsert=True)

# 运行混合搜索查询
results = hybrid_db.search("chicken coconut soup", limit=5)
print("Hybrid Search Results:", results)
```

## 查看更多示例

如需实践代码和高级用法，请在此处查看每个支持的向量数据库的混合搜索示例[here](../examples/concepts/hybrid-search/)
