ElasticSearch查询指南:从青铜到王者的骚操作
本文来源于笔者的CSDN原创,由于掘金>已经去掉了转载功能,所以只好重新上传,以下图片依然保持最初发布的水印(如CSDN水印)。(以后属于本人原创均以新建状态在多个平台分享发布)
第一章 倒排索引:ES的"新华字典"制作指南
1.1 反向操作的艺术
想象你有一本菜谱,但目录是按食材排列的:
- 🥚鸡蛋 → [番茄炒蛋 P12, 蛋花汤 P45]
- 🍅番茄 → [番茄炒蛋 P12, 罗宋汤 P33]
索引实战三部曲:
PUT /cookbook/_doc/1
{
"title": "深夜食堂之黯然销魂饭",
"ingredients": ["叉烧", "温泉蛋", "葱花"],
"steps": "将叉烧切成..."
}
GET /cookbook/_search
{
"query": {
"match": { "ingredients": "温泉蛋 叉烧" }
}
}
第二章 DSL语法:搜索界的乐高积木
2.1 万能bool查询:相亲条件排列组合
{
"query": {
"bool": {
"must": [ // 必须满足
{ "term": { "gender": "女" } },
{ "range": { "age": { "gte": 25 } } }
],
"should": [ // 满足更好
{ "term": { "hasPet": "布偶猫" } },
{ "match": { "hobby": "滑雪 潜水" } }
],
"must_not": { // 绝对不要
"term": { "character": "妈宝男" }
},
"filter": [ // 精确筛选
{ "geo_distance": { "distance": "10km", "location": "陆家嘴" } }
]
}
}
}
2.2 查询全家桶套餐
查询类型 | 使用场景 | 相当于相亲中的… |
---|---|---|
term | 精准匹配 | “必须本地户口!” |
match | 语义分析 | “三观合得来就行” |
match_phrase | 词组匹配 | “要求’上海交大毕业’” |
range | 范围筛选 | “身高175cm以上” |
第三章 高阶操作:搜索结果的精装修
3.1 分页的陷阱与救赎
// 基础分页(小数据量适用)
{
"from": 100,
"size": 10,
"query": { "match_all": {} }
}
// 深度分页正确姿势
{
"size": 10,
"sort": [
{ "timestamp": "desc" },
{ "_id": "asc" }
],
"search_after": [1625000000, "abc123"]
}
3.2 排序的七十二变
// 多维度排序示例
{
"sort": [
{ "price": { "order": "asc" } }, // 优先便宜货
{ "sales": { "order": "desc" } }, // 其次销量王
{ "_score": { "order": "desc" } } // 最后匹配度
]
}
第四章 实战演练:电商搜索系统改造记
4.1 索引定义:给商品打标签
PUT /ecommerce
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": { "type": "keyword" }
}
},
"price": { "type": "double" },
"category": { "type": "keyword" },
"tags": { "type": "nested" }
}
}
}
4.2 综合查询:找性价比之王
GET /ecommerce/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "无线耳机" } }
],
"filter": [
{ "range": { "price": { "gte": 199, "lte": 599 } } },
{ "term": { "category": "数码配件" } }
],
"should": [
{ "term": { "tags": "七天无理由退货" } },
{ "term": { "tags": "旗舰店" } }
]
}
},
"sort": [
{ "rating": { "order": "desc" } },
{ "price": { "order": "asc" } }
],
"from": 0,
"size": 20
}
结果分析技巧:
{
"took": 48, // 查询耗时48ms
"hits": {
"total": { "value": 82 }, // 共82件商品符合
"max_score": null,
"hits": [
{
"_score": 12.345,
"_source": {
"title": "【旗舰店】Beats无线降噪耳机",
"price": 499.00,
"rating": 4.8
},
"sort": [4.8, 499.0] // 排序字段值
}
]
}
}
第五章 避坑宝典:来自ES老司机的忠告
5.1 中文分词惨案现场
错误示范:
{ "term": { "title": "小米手机" } } // 永远搜不到!
正确姿势:
{ "match": { "title": "小米手机" } } // 自动分词搜索
// 精确匹配需用keyword
{ "term": { "title.keyword": "小米手机" } }
5.2 性能优化三板斧
- 索引设计防脱发:
PUT /logs-2023-08
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
- 批量操作保平安:
# 错误示范:循环单条插入
for data in dataset:
es.index(data)
# 正确姿势:批量操作
from elasticsearch.helpers import bulk
bulk(es, ({"_index":"logs","_source":data} for data in dataset))
- 冷热数据分离术:
Hot节点(NVMe SSD) ←→ Warm节点(SATA SSD) ←→ Cold节点(HDD归档)
ES生存法则:
遇到性能问题先看日志,再看内存,最后默念三遍"分片设置合理吗?"
查询DSL就像搭积木,多摔几次就熟练了~
记住:永远不要在凌晨3点修改生产环境的Mapping!😱