Windows Elasticsearch 完整上手教程

本文从部署、概念、接口调试、Java接入、常用查询讲解ES的使用。

一、ES核心定位

1)是什么

Elasticsearch(ES):分布式全文检索引擎,基于Lucene封装,RESTful API,JSON交互;靠倒排索引实现海量数据秒级全文检索、聚合统计,典型ELK日志栈、电商搜索、埋点分析组件。

2)和MySQL对比

ES概念 MySQL等价 说明
Index(索引) Database库 7.x废弃type,一个索引只存一类数据
Document文档 Row行记录 JSON格式单条数据,自带_id唯一标识
Field字段 Column列 单个属性
Mapping映射 Table表结构 定义字段类型、分词、是否索引
Shard主分片 分库分表 水平拆分,创建索引时数量固定不可改
Replica副本 备份 容灾+分担查询压力,可动态修改数量

3)两种核心字段类型

  1. text:分词、全文模糊搜索(商品标题、文章内容);
  2. keyword:不分词、精确匹配、排序、聚合(手机号、订单号、状态)。

二、Windows单机部署 ES+Kibana

版本配套规则

ES和Kibana大版本必须完全一致 ,示例用8.x稳定版;Windows解压即用,路径不能中文、空格

步骤1:下载解压

  1. ES压缩包:elasticsearch-8.x-windows-x86_64.zip

  2. Kibana压缩包:kibana-8.x-windows-x86_64.zip
    解压示例:

    D:\soft\es8
    D:\soft\kibana8

步骤2:ES配置

关闭安全、单机模式

编辑 config/elasticsearch.yml,追加:

yaml 复制代码
# 允许外网访问
network.host: 0.0.0.0
http.port: 9200
# 单机节点,不用集群
discovery.type: single-node
# 关闭Xpack安全认证(开发环境)
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

修改JVM内存 config/jvm.options(本机开发推荐):

复制代码
-Xms512m
-Xmx512m

步骤3:启动ES

执行 bin/elasticsearch.bat,黑窗口不要关闭;

验证:浏览器访问 http://127.0.0.1:9200,返回版本JSON即成功。

步骤4:Kibana可视化控制台

写DSL必备

  1. 修改 config/kibana.yml
yaml 复制代码
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
  1. 启动:bin/kibana.bat
  2. 访问:http://127.0.0.1:5601 → 左侧 Dev Tools,直接执行DSL语句。

IK中文分词器

默认英文分词,中文必须装IK,版本和ES严格一致:

bash 复制代码
# ES根目录执行
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.15.1/elasticsearch-analysis-ik-8.15.1.zip

重启ES生效;分词模式:

  • ik_max_word:细粒度拆分(检索用)
  • ik_smart:粗粒度拆分(存入索引用)

三、DSL全套CRUD实操

1)索引操作

json 复制代码
# 1. 创建索引+Mapping(商品索引,固定字段类型)
PUT /goods
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "id": {"type": "keyword"},
      "title": {"type": "text","analyzer":"ik_max_word"},
      "price": {"type": "double"},
      "category": {"type": "keyword"},
      "stock": {"type": "integer"}
    }
  }
}

# 查看索引结构
GET /goods/_mapping

# 删除索引(谨慎)
DELETE /goods

# 查看所有索引
GET /_cat/indices?v

2)文档CRUD

json 复制代码
# 新增文档(指定_id=1)
PUT /goods/_doc/1
{
  "id":"1001",
  "title":"华为Mate70智能手机",
  "price":4999,
  "category":"手机",
  "stock":100
}

# 查询单条
GET /goods/_doc/1

# 全量更新(覆盖整条)
PUT /goods/_doc/1
{
  "id":"1001",
  "title":"华为Mate70 Pro",
  "price":5499,
  "category":"手机",
  "stock":88
}

# 局部更新(只改单个字段,推荐)
POST /goods/_update/1
{
  "doc":{"stock":80}
}

# 删除文档
DELETE /goods/_doc/1

# 批量插入多条
POST /goods/_bulk
{"index":{"_id":2}}
{"id":"1002","title":"小米15手机","price":3999,"category":"手机","stock":200}
{"index":{"_id":3}}
{"id":"1003","title":"机械键盘","price":199,"category":"外设","stock":500}

3)高频检索DSL

(1)全文检索(text分词模糊匹配)
json 复制代码
# 标题含"手机"
GET /goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  }
}
(2)精确匹配(keyword)
json 复制代码
GET /goods/_search
{
  "query": {
    "term": {
      "category": {"value":"手机"}
    }
  }
}
(3)范围查询+分页+排序
json 复制代码
# 价格100~5000,价格降序,第1页每页10条
GET /goods/_search
{
  "from":0,
  "size":10,
  "sort":[{"price":"desc"}],
  "query":{
    "range":{"price":{"gte":100,"lte":5000}}
  }
}
(4)布尔组合多条件
json 复制代码
# 必须是手机 + 价格小于4500,过滤不参与打分
GET /goods/_search
{
  "query": {
    "bool": {
      "must": [{"match":{"title":"手机"}}],
      "filter": [{"range":{"price":{"lte":4500}}}]
    }
  }
}
(5)聚合统计(分类销量、均价)
json 复制代码
GET /goods/_search
{
  "size":0,
  "aggs": {
    "group_by_category": {
      "terms": {"field":"category"},
      "aggs": {
        "avg_price": {"avg":{"field":"price"}}
      }
    }
  }
}

四、SpringBoot整合ES

Maven依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

application.yml配置

yaml 复制代码
spring:
  elasticsearch:
    uris: http://127.0.0.1:9200

方式1:Repository

简单CRUD,类似MyBatis

  1. 实体类映射ES索引
java 复制代码
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Data
@Document(indexName = "goods")
public class GoodsDoc {
    @Id
    private String id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String title;
    @Field(type = FieldType.Keyword)
    private String category;
    @Field(type = FieldType.Double)
    private Double price;
    private Integer stock;
}
  1. Mapper接口
java 复制代码
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface GoodsEsRepo extends ElasticsearchRepository<GoodsDoc,String> {
}
  1. 调用示例
java 复制代码
@Autowired
private GoodsEsRepo goodsEsRepo;

// 新增
goodsEsRepo.save(new GoodsDoc());
// 根据id查询
Optional<GoodsDoc> doc = goodsEsRepo.findById("1");

方式2:ElasticsearchRestTemplate

用于复杂DSL、聚合、多条件

适合自定义复杂检索,手动拼接DSL,企业主流用法。

五、经典业务架构:MySQL同步ES两种方案

方案1:Canal监听Binlog同步

实时同步

MySQL binlog → Canal → Kafka → Java消费端写入ES,延迟毫秒级,适合订单、商品实时更新场景。

方案2:Logstash定时同步

配置JDBC输入源,定时轮询MySQL增量数据,批量写入ES,T+1离线同步。

六、高频踩坑

  1. text和keyword用反
    模糊搜索用match(text);精确查询、排序、聚合必须term(keyword),否则查不出数据。
  2. 深分页 from+size>10000
    ES默认禁止,大数据分页改用search_after游标分页。
  3. 不要用%关键词%通配符查询
    全表扫描CPU打满,ES天然分词检索,改用match即可。
  4. Mapping动态自动推断字段
    线上关闭dynamic:true,防止随意新增字段导致索引膨胀、查询变慢。
  5. 分片数量一经创建不能修改
    单机开发主分片设1,集群部署按节点规划,只能重建索引修改。
相关推荐
yyuuuzz1 小时前
独立站运营的几个技术层面常见问题
大数据·运维·服务器·网络·数据库·aws
XIAOYU6720131 小时前
高中物理成绩优异,适合报考大数据哪个细分专业数学成绩偏弱,还适合填报大数据相关专业吗
大数据
2601_954971131 小时前
大数据需要掌握哪些主流大数据工具框架
大数据
fastjson_1 小时前
备份与恢复驱动
windows
caimouse2 小时前
Reactos 第 9 章 设备驱动 — 9.12 MDL
windows
daly5202 小时前
Notepad++怎么下载?2026最新版Notepad++安装教程(Windows免费文本编辑器)
windows·notepad++·notepad
冰帆<2 小时前
[特殊字符] 深度起底:突破火山引擎 Ark-Helper 的 Linux 底层环境死锁,顺手魔改一份 Windows 一键安装脚本!
linux·windows·火山引擎
Urbano2 小时前
工装标准缝纫流程及自动化升级提质增产方案
大数据·人工智能·算法
wanghowie2 小时前
35. 从AI客服到AI运营助手:Workflow、Single Agent、Multi-Agent、Agent Native 的架构选型实践
大数据·人工智能·架构