查询 DSL
match、term、bool、filter vs query。
40 分钟
查询 DSL
Elasticsearch Query DSL 用 JSON 描述检索逻辑:match 全文、term 精确、bool 组合。理解 query vs filter 对性能与 _score 的影响。
学习目标
- 编写
match、term、bool查询 - 区分 filter 上下文与 query 上下文
- 为课程搜索实现多字段 + 分类过滤
核心内容
match 全文检索
curl -s -X POST "localhost:9200/tracks/_search" -H "Content-Type: application/json" -d '
{
"query": {
"match": {
"title": "Spring Boot"
}
},
"_source": ["slug", "title", "category"]
}'
operator: "and" 要求所有词都出现;默认 or 更宽松。
term 精确匹配
curl -s -X POST "localhost:9200/tracks/_search" -H "Content-Type: application/json" -d '
{
"query": {
"term": { "category": "backend" }
}
}'
注意:term 不对 text 字段分词结果查询;过滤 category 等 keyword 字段。对 title 用 match 而非 term。
bool 组合
curl -s -X POST "localhost:9200/tracks/_search" -H "Content-Type: application/json" -d '
{
"query": {
"bool": {
"must": [
{ "multi_match": {
"query": "数据库",
"fields": ["title^2", "summary"]
}}
],
"filter": [
{ "term": { "level": "intermediate" } },
{ "terms": { "category": ["backend", "devops"] } }
]
}
},
"size": 10,
"highlight": {
"fields": { "title": {}, "summary": {} }
}
}'
must 参与 _score;filter 不计分可缓存——category、level 等过滤放 filter。
对照 MySQL:WHERE category IN (...) + 全文索引。复杂相关性用 ES 实验 index;权威列表 仍走 spring-boot-essentials JPA 分页。
练习
- 实现「标题含 Java + category=backend」的 bool 查询
- 对比同一条件放在
mustvsfilter的_score差异 - 加 highlight,确认摘要片段返回