本文从部署、概念、接口调试、Java接入、常用查询讲解ES的使用。一、ES核心定位1是什么ElasticsearchES分布式全文检索引擎基于Lucene封装RESTful APIJSON交互靠倒排索引实现海量数据秒级全文检索、聚合统计典型ELK日志栈、电商搜索、埋点分析组件。2和MySQL对比ES概念MySQL等价说明Index索引Database库7.x废弃type一个索引只存一类数据Document文档Row行记录JSON格式单条数据自带_id唯一标识Field字段Column列单个属性Mapping映射Table表结构定义字段类型、分词、是否索引Shard主分片分库分表水平拆分创建索引时数量固定不可改Replica副本备份容灾分担查询压力可动态修改数量3两种核心字段类型text分词、全文模糊搜索商品标题、文章内容keyword不分词、精确匹配、排序、聚合手机号、订单号、状态。二、Windows单机部署 ESKibana版本配套规则ES和Kibana大版本必须完全一致示例用8.x稳定版Windows解压即用路径不能中文、空格。步骤1下载解压ES压缩包elasticsearch-8.x-windows-x86_64.zipKibana压缩包kibana-8.x-windows-x86_64.zip解压示例D:\soft\es8 D:\soft\kibana8步骤2ES配置关闭安全、单机模式编辑config/elasticsearch.yml追加# 允许外网访问network.host:0.0.0.0http.port:9200# 单机节点不用集群discovery.type:single-node# 关闭Xpack安全认证开发环境xpack.security.enabled:falsexpack.security.enrollment.enabled:falsexpack.security.http.ssl.enabled:falsexpack.security.transport.ssl.enabled:false修改JVM内存config/jvm.options本机开发推荐-Xms512m -Xmx512m步骤3启动ES执行bin/elasticsearch.bat黑窗口不要关闭验证浏览器访问http://127.0.0.1:9200返回版本JSON即成功。步骤4Kibana可视化控制台写DSL必备修改config/kibana.ymlserver.host:0.0.0.0elasticsearch.hosts:[http://127.0.0.1:9200]启动bin/kibana.bat访问http://127.0.0.1:5601→ 左侧Dev Tools直接执行DSL语句。IK中文分词器默认英文分词中文必须装IK版本和ES严格一致# ES根目录执行bin/elasticsearch-plugininstallhttps://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索引操作#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?v2文档CRUD# 新增文档指定_id1PUT/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高频检索DSL1全文检索text分词模糊匹配# 标题含手机GET/goods/_search{query:{match:{title:手机}}}2精确匹配keywordGET/goods/_search{query:{term:{category:{value:手机}}}}3范围查询分页排序# 价格100~5000价格降序第1页每页10条GET/goods/_search{from:0,size:10,sort:[{price:desc}],query:{range:{price:{gte:100,lte:5000}}}}4布尔组合多条件# 必须是手机价格小于4500过滤不参与打分GET/goods/_search{query:{bool:{must:[{match:{title:手机}}],filter:[{range:{price:{lte:4500}}}]}}}5聚合统计分类销量、均价GET/goods/_search{size:0,aggs:{group_by_category:{terms:{field:category},aggs:{avg_price:{avg:{field:price}}}}}}四、SpringBoot整合ESMaven依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependencyapplication.yml配置spring:elasticsearch:uris:http://127.0.0.1:9200方式1Repository简单CRUD类似MyBatis实体类映射ES索引importlombok.Data;importorg.springframework.data.annotation.Id;importorg.springframework.data.elasticsearch.annotations.Document;importorg.springframework.data.elasticsearch.annotations.Field;importorg.springframework.data.elasticsearch.annotations.FieldType;DataDocument(indexNamegoods)publicclassGoodsDoc{IdprivateStringid;Field(typeFieldType.Text,analyzerik_max_word)privateStringtitle;Field(typeFieldType.Keyword)privateStringcategory;Field(typeFieldType.Double)privateDoubleprice;privateIntegerstock;}Mapper接口importorg.springframework.data.elasticsearch.repository.ElasticsearchRepository;publicinterfaceGoodsEsRepoextendsElasticsearchRepositoryGoodsDoc,String{}调用示例AutowiredprivateGoodsEsRepogoodsEsRepo;// 新增goodsEsRepo.save(newGoodsDoc());// 根据id查询OptionalGoodsDocdocgoodsEsRepo.findById(1);方式2ElasticsearchRestTemplate用于复杂DSL、聚合、多条件适合自定义复杂检索手动拼接DSL企业主流用法。五、经典业务架构MySQL同步ES两种方案方案1Canal监听Binlog同步实时同步MySQL binlog → Canal → Kafka → Java消费端写入ES延迟毫秒级适合订单、商品实时更新场景。方案2Logstash定时同步配置JDBC输入源定时轮询MySQL增量数据批量写入EST1离线同步。六、高频踩坑text和keyword用反模糊搜索用match(text)精确查询、排序、聚合必须term(keyword)否则查不出数据。深分页 fromsize10000ES默认禁止大数据分页改用search_after游标分页。不要用%关键词%通配符查询全表扫描CPU打满ES天然分词检索改用match即可。Mapping动态自动推断字段线上关闭dynamic:true防止随意新增字段导致索引膨胀、查询变慢。分片数量一经创建不能修改单机开发主分片设1集群部署按节点规划只能重建索引修改。