ElasticSearch查询指南:从青铜到王者的骚操作

news/2025/2/24 20:24:26

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 性能优化三板斧

  1. 索引设计防脱发
PUT /logs-2023-08
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}
  1. 批量操作保平安
# 错误示范:循环单条插入
for data in dataset:
    es.index(data)

# 正确姿势:批量操作
from elasticsearch.helpers import bulk
bulk(es, ({"_index":"logs","_source":data} for data in dataset))
  1. 冷热数据分离术
Hot节点(NVMe SSD) ←→ Warm节点(SATA SSD) ←→ Cold节点(HDD归档)

ES生存法则
遇到性能问题先看日志,再看内存,最后默念三遍"分片设置合理吗?"
查询DSL就像搭积木,多摔几次就熟练了~
记住:永远不要在凌晨3点修改生产环境的Mapping!😱


http://www.niftyadmin.cn/n/5864789.html

相关文章

vue-fastapi-admin 部署心得

vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统,找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整,那项目文件放在容器外部&#xf…

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

从零实现机器人自主避障

1. 编译工具安装 sudo apt update sudo apt install python3-catkin-pkg python3-rosdep python3-rosinstall-generator python3-wstool python3-rosinstall build-essential sudo rosdep init rosdep update2. 构建节点 mkdir -p ~/ros2_ws/src cd ~/ros2_ws ros2 pkg creat…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

使用Socket编写超牛的http服务器和客户端(二)

客户端 动态扩展连接池、线程池优雅关闭、超时机制、健康检查等功能,并将代码模块化: 文件结构 HTTPClientProject/ ├── ConnectionPool.h ├── ConnectionPool.cpp ├── TaskQueue.h ├── ThreadPool.h ├── main.cpp 工程代码主要分为以下几个模块: Connectio…

go执行java -jar 完成DSA私钥解析并签名

起因,最近使用go对接百度联盟api需要使用到DSA私钥完成签名过程,在百度提供的代码示例里面没有go代码的支持,示例中仅有php、python2和3、java的代码,网上找了半天发现go中对DSA私钥解析支持不友好,然后决定使用在java…

微信小程序页面导航与路由:实现多页面跳转与数据传递

在上一篇中,我们学习了微信小程序的数据绑定和事件处理,实现了动态交互功能。然而,一个完整的小程序通常由多个页面组成,用户需要在不同页面之间进行跳转。本文将深入探讨微信小程序的页面导航与路由机制,帮助你实现多…

leetcode_位运算 2206. 将数组划分成相等数对

2206. 将数组划分成相等数对 给你一个整数数组 nums,它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对,满足: 每个元素 只属于一个数对。同一数对中的元素相等 。如果可以将 nums 划分成 n 个数对,请你返回 true &#xff0…