Query DSL 是 Elasticsearch 的 JSON 查询语言。全文相关性条件放 Query Context,必须满足但不应改变得分的条件放 Filter Context;这个区分让查询更准确,也更容易缓存和解释。
Table of contents
Open Table of contents
match 与 term 不可互换
match 会先分析查询文本,适合 text 字段;term 按精确词项匹配,适合 keyword、数字和状态。对 text 字段直接使用 term,常见结果是大小写或分词后无法命中。
{
"query": {
"bool": {
"must": [{ "match": { "title": "Java 架构" } }],
"filter": [
{ "term": { "category": "book" } },
{ "range": { "priceCents": { "lte": 10000 } } }
],
"must_not": [{ "term": { "status": "deleted" } }]
}
}
}
must 必须匹配并参与评分,filter 必须匹配但不评分,must_not 排除,should 可提升或在设置 minimum_should_match 后表达至少命中几个条件。
先设计查询合同
搜索 API 不应允许客户端直接提交任意 DSL。应用将 q、分类、价格区间和排序等受控参数转换为 DSL,并限制数组长度、聚合数量、超时时间和返回字段。这样可以阻止昂贵通配符或脚本查询拖垮集群。
运行实验室过滤测试下载:
mvn -Dtest=SearchArchitectureTest#invertedIndexFindsDocumentsAndFilterDoesNotChangeScore test
测试证明分类只缩小候选集,不为 book 人为增加相关性分数。真实查询使用 _explain 查看单文档得分来源,用 Profile API 定位慢阶段;它们开销较高,只在诊断时使用。
零结果、超时和部分分片失败都要进入指标。零结果不一定是故障,也可能暴露词汇不匹配,后续应通过查询集、同义词或内容治理改善。
下一步
继续阅读09-05 BM25、搜索相关性与排序调优,理解 _score 从哪里来。