跳到正文
Elaine Blog
返回

Query DSL 与 Filter Context

Elasticsearch 与搜索架构

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 从哪里来。


分享这篇文章:

上一篇
Mapping、Analysis 与数据管理
下一篇
BM25、搜索相关性与排序调优