查询扩展
查询扩展为同一个信息需求补充其他表达方式,帮助检索找到使用不同术语的资料。扩展词汇时仍需保留原来的对象、时间和范围。
理解与应用
查询扩展是在原查询之外加入相关词语或新的查询表达,以找到原本可能漏掉的资料。用户说法和文档术语往往不同,例如“报销被打回”在制度中写作“报销退回”或“审批驳回”。搜索这些相关表达,可以为同一个问题增加入口;扩展也可以利用术语表、缩写表或模型生成的候选。
假设用户要查青禾项目在 2026 年使用的报销退回规则。原查询只搜索“打回”,可能没有结果;补上“退回”“审批驳回”后,能够找到制度条款。但项目与年份仍然是限制条件,不能因为某篇旧文档措辞更相近就把它当成有效结果。“退款”虽然也带一个“退”字,描述的却是另一类业务,不宜机械加入。
扩展增加的是候选,不是已经确认的答案。合并多条查询的结果时需要去重,也值得保留哪些资料是原查询命中、哪些由扩展带来。这样才能发现新增结果到底补上了关键证据,还是只增加了阅读量。对于含糊缩写,先利用上下文确定含义通常比同时搜索所有解释更有效;真正有歧义时仍可能需要询问用户。
动手试一试:补充相关术语,项目和年份保持不变
人工词表补充了 B,但没有改变项目或年度条件。代码使用精确字段匹配来展示范围控制;真实全文检索还需要确认新增结果中的“审批驳回”确实讨论报销规则。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
query = {"term": "打回", "project": "青禾", "year": 2026}
terms = {"打回", "退回", "审批驳回"}
documents = [
{"id": "A", "term": "打回", "project": "青禾", "year": 2026},
{"id": "B", "term": "审批驳回", "project": "青禾", "year": 2026},
{"id": "C", "term": "退回", "project": "青禾", "year": 2024},
{"id": "D", "term": "退回", "project": "其他项目", "year": 2026},
]
def search(allowed_terms):
return [doc["id"] for doc in documents
if doc["term"] in allowed_terms
and doc["project"] == query["project"]
and doc["year"] == query["year"]]
print("原查询:", ",".join(search({query["term"]})))
print("扩展后:", ",".join(search(terms)))运行结果
原查询: A 扩展后: A,B
常见误区
- 扩展时顺手加入“免费”“最新”或另一个产品名,会在用户未要求的情况下改变检索目标。
- 生成大量相关词却不评估新增结果,容易同时增加噪声、延迟和后续阅读成本。
前置与延伸
建议先读
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Stanford:Introduction to Information Retrieval — Query expansion ↗
已核对作者托管的教材章节;用于查询扩展定义,术语表与实验语料为本文自拟。 · 核验:2026-10-10