千万别再因网上那些繁杂的搜索引擎教程而遭到劝退啦,这篇文章是从零基础起步的,直接将一套7.12.1版本Elasticsearch放进Linux服务器里并使其运行起来,整个过程仅有实际操作而没有多余的话语,极其适合正处于赶工期要接入搜索功能的开发人员进行回顾参照。

核心原理一句话讲透

docker pull elasticsearch:7.12.1

ES从本质上来说,是一个属于倒排索引的字典库。你把文档投放进去之后,它会先对内容进行切词操作,就比如说像“红烧肉”这个词,会被切成“红烧”跟“肉”这两个词,之后会记录每一个词究竟出现在哪些文档当中。当进行搜索的时候,如果输入“肉”这个词,它会直接去翻动词库,从而找到所有包含“肉”这个词的文档。

docker network create es

在2026年此时,Elasticsearch是开源搜索引擎里使用率最高的项目,不存在其他可与之比拟者,Netflix、Uber、京东于生产环境进行大规模部署,在社区随意搜索便有海量踩坑记录,其生态成熟到致使你很难碰到无解的问题。

docker run -d 
  --name elasticsearch 
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 
  -e "discovery.type=single-node" 
  --privileged 
  --network es 
  -p 9200:9200 
  -p 9300:9300 
  elasticsearch:7.12.1

docker cp elasticsearch:/usr/share/elasticsearch/config {你本地存放elasticsearch文件的地方}
docker cp elasticsearch:/usr/share/elasticsearch/data {你本地存放elasticsearch文件的地方}
docker cp elasticsearch:/usr/share/elasticsearch/logs {你本地存放elasticsearch文件的地方}
docker cp elasticsearch:/usr/share/elasticsearch/plugins {你本地存放elasticsearch文件的地方}

容器化部署三分钟起步

docker stop elasticsearch
docker rm elasticsearch

将其用Docker进行部署乃是最为快速的途径。我们选取7.12.1版本作为示例,首先创建一个能够使ES与Kibana实现互通的私有网络。在首次启动容器之时,它会生成众多默认配置文件,此时不要急于修改,而是先执行docker cp操作,把容器内部的config文件夹拷贝至宿主机。

docker run -d 
  --name elasticsearch 
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 
  -e "discovery.type=single-node"    
  -v {你本地存放elasticsearch文件的地方}/data:/usr/share/elasticsearch/data 
  -v {你本地存放elasticsearch文件的地方}/logs:/usr/share/elasticsearch/logs 
  -v {你本地存放elasticsearch文件的地方}/config:/usr/share/elasticsearch/config 
  -v {你本地存放elasticsearch文件的地方}/plugins:/usr/share/elasticsearch/plugins 
  --privileged 
  --network es 
  -p 9200:9200 
  -p 9300:9300 
  elasticsearch:7.12.1

立刻将此临时容器在拷完之后关掉。当第二次启动之际,运用 -v 参数把宿主机当中的配置文件映射至容器之内,如此一来,你直接于宿主机修改配置,容器内部便会实时呈现生效状态。整个流程完成所需时间不超过三分钟,把查阅文档以及敲击命令全部处理完毕。

docker cp {文件路径} elasticsearch:/usr/share/elasticsearch

分词器必须离线安装

docker exec -it 容器id /bin/sh

ES自身所带的分词器对于中文而言简直就是睁眼瞎,当你搜索“中华人民共和国”时,它会把其切割成“中华”、“人民”、“共和国”这三部分。IK分词器乃是当前最为稳定的方案,前往GitHub的medcl/elasticsearch - analysis -ik仓库去找到7.12.1版本的zip包,不要使用wget进行在线安装,因为内网服务器常常连接不上。

./bin/elasticsearch-plugin install file:elasticsearch-analysis-ik-7.12.1.zip

先将有着包格式的zip包丢进服务器里面,接着运用docker cp这种方式把它拷进容器当中,随后执行elasticsearch-plugin install的是file://这般路径的.zip文件。安装完成之后重启容器,在索引创建期间指定analyzer为ik_max_word,当搜索“核酸检测”时它方可知晓这是一个完整的词组,而不会把它拆分成“核酸”以及“检测”。

sudo useradd es-user
su es-user

宿主机部署踩坑实录

Elasticsearch快速部署入门教程_编程入门Elasticsearch入门_Elasticsearch从0到SpringBoot集成使用

若你执意要于物理机上运行的话,首先碰到的一个难题便是root用户无法启动。因ES基于安全方面的考量而硬性禁止使用root,故而你得先要执行useradd esuser操作。另外一个问题则是JDK版本,7.12.1强制性规定必须JDK11及以上版本,然而许多服务器预先安装的却是jre,甚至连javac都不存在。

最可靠的法子是使ES运用自带的JDK,开启bin/elasticsearch-env文件,你会发觉它优先寻觅ES_JAVA_HOME,根本不瞧系统JAVA_HOME,直接将17版的JDK解压至/usr/local/jdk17,设定ES_JAVA_HOME指向它,启动报错瞬间少一半。想进行JVM调参,千万别去改动jvm.options,要在jvm.options.d/这个目录下新建文件去完成,它是按照字典序加载的,像00 - heap.options这样的写法稳妥得就像狗一样。

Kibana让数据开口说话

#仅在jdk版本为8或超过8的时候起效
8-:-Xmx2g
#仅在jdk版本为8到9的时候起效
8-9:-Xmx2g

执行 Kibana 部署,实际上只需进行一行 docker run 操作,开启端口 5601 后,在浏览器中输入 IP 便能够看到控制台。不要一开始就去摆弄那些花里胡哨的地图,首先要前往 Stack Management 创建索引模式,并指定你 ES 里用于存储业务数据的那个索引。

建完之后切换到Discover面板,在搜索框里面尝试输入那一条条你昨天所导入的订单号,只要分词没有配置错误,实时的数据马上就要刷出来。至于那些报表、仪表盘功能那都是后面再说的事情,首先要学会到底怎样去查看原始日志,一旦出现问题至少能够确定是数据没有进入进来还是根本查询不出来。

Java客户端CRUD保姆级代码

Spring Boot项目当中,要引入es-rest-high-level-client,其版本号务必得跟服务器端全然相同,倘若版本号是7.12.1,那就全都采用7.12.1,哪怕差了一个补丁号,都极有可能出现序列化报错的情况。在创建RestHighLevelClient期间,对于lowLevelClient,要将连接超时设置为5秒,把socket超时设置为60秒,毕竟在生产环境里,慢查询的情况可太多见了。

docker pull kibana:7.12.1

docker run -d 
	--name kibana 
	-e ELASTICSEARCH_HOSTS=http://{你部署es的服务器地址}:9200 
	--network=es 
	-p 5601:5601 
	kibana:7.12.1

采用批量操作之时,直接运用BulkRequest,朝着其中add各类IndexRequest、UpdateRequest。尤为实用的当属updateOrInsert,你借助updateRequest.upsert(),若存在便予以更新,若不存在则进行插入,幂等操作搭配定时任务重新运行数据,不会生成重复记录。在进行查询之际,SearchSourceBuilder里面from以及size用于控制分页,第一页十条记录是from=0,size=10。通过rangeQuery来进行时间范围查询,所涉及的字段为createTime,其中gte和lte需传递字符串格式为"yyyy-MM-dd HH:mm:ss" 的内容。

针对高亮这一处理,它虽极其坑人,可又是绝对必要的需求。你得先进行highlightBuilder.field("content")这样的操作,接着呢,要把preTags以及postTags设定为红字标签,就好比是""这种样式。当去搜索“退款”这个词的时候,在响应里要经过getHits()来获取SearchHit,之后再借助getHighlightFields()获取content字段,而这个字段里面所包裹着的就是带有标签的命中片段,最后直接将其渲染到前端页面那儿就可以了。

编程入门Elasticsearch入门_Elasticsearch从0到SpringBoot集成使用_Elasticsearch快速部署入门教程

瞅见这儿,你已然把控了自部署直至业务集成的全然链路。现下疑惑产生了:你于生产环境运用ES之际,碰到过最为匪夷所思的坑是啥?于评论区予以分享,我来帮你剖析排查思路,顺便为本文点个赞以使更多遭受ES折磨的 fellow 看到。

Elasticsearch快速部署入门教程_编程入门Elasticsearch入门_Elasticsearch从0到SpringBoot集成使用

Elasticsearch从0到SpringBoot集成使用_Elasticsearch快速部署入门教程_编程入门Elasticsearch入门