一文解决Elasticsearch下载安装以及使用配置
一文解决Elasticsearch下载安装以及使用配置
一、版本介绍
Es下载地址:https://www.elastic.co/cn/downloads/elasticsearch
Kinbana 下载地址https://www.elastic.co/cn/downloads/kibana
spring boot和elasticsearch存在兼容性问题,所以下图是版本对照表

Es的各个大版本中,6.*发布时时间太久,8.*发布时间太短,可能会遇到小bug,综合考虑7.*版本最合适,本文就以elasticsearch 7.10版本为目标版本。
二、下载安装(linux系统)
2.安装
2.1创建安装目路
例如:mkdir -p /usr/local/software/elasticsearch
cd /usr/local/software/elasticsearch/
2.2下载版本安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz
2.3解压压缩文件
tar -xzvf elasticsearch-7.10.0-linux-x86_64.tar.gz
2.4先搭建单个节点
path.data: /opt/data
path.logs: /opt/logs
#http访问端口,程序或kibana使用
http.port: 9200
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
2.5创建es安全用户,es规定不允许root用户运行es
(1)、创建新的用户
adduser elasticsearch
(2)、设置用户密码
passwd elasticsearch
(3)、授权给新建用户es文件夹的权限
chown -R elasticsearch /usr/local/software/elasticsearch/elasticsearch-7.10.0
(4)、使用命令 ll 产看授权是否成功,如图,es解压的目录已授权给elastic用户
(5)、切换用户
su elasticsearch
2.5修改修改elasticsearch.yml
进入es解压目录/config目录下找到elasticsearch.yml文件,在该文件末尾增加以下内容:
#设置集群名称,集群内所有节点的名称必须一致。
cluster.name: elasticsearch
#设置节点名称,集群内节点名称必须唯一。
node.name: node-1
#表示该节点会不会作为主节点,true表示会;false表示不会
node.master: true
#当前节点是否用于存储数据,是:true、否:false
node.data: true
network.host: 你服务器的ip
#es对外提供的http端口,默认 9200
http.port: 9200
#TCP的默认监听端口,默认 9300
transport.tcp.port: 9300
es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.ping.unicast.hosts: [“服务器1的ip”,“服务器2的ip”]
es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: [“node-1”,“node-2”]
ingest.geoip.downloader.enabled: false
2.6修改jvm.options
根据机器具体配置来修改参数
-Xms8g
-Xmx8g
3.修改其他配置
3.1修改/etc/security/limits.conf
在文件末尾增加以下内容
#配置 es 用户打开文件最大数(因为es在启动时调用的文件超出普通用户默认打开文件最大数4096,会导致报错)
在文件末尾中增加下面内容
es soft nofile 65536
es hard nofile 65536
3.2改/etc/security/limits.d/20-nproc.conf
在文件末尾增加以下内容,文件不存在就新建该文件
#每个进程可以打开的文件数限制
es soft nofile 65536
es hard nofile 65536
#操作系统级别对每个用户创建的进程数的限制
- hard nproc 4096
3.3修改/etc/sysctl.conf
在末尾加入以下内容
#一个进程可以拥有的虚拟内存区域的数量
vm.max_map_count=655360
然后执行命令重新加载
sysctl -p
4.配置其他几台服务器
其他几台集群均按照上述步骤配置,唯一不同的是上述2.5步骤的配置中,node.name名字改成自己的,以及cluster.initial_master_nodes
5.启动es
5.1切换用户
#切换到前面步骤新建的用户
su elastic
5.2启动
执行./elasticsearch启动es
5.3注:
如果启动失败,检查服务器防火墙是否开启以及对应端口是否开放,检查命令及开放命令如下
#启动服务器防火墙
systemctl start firewalld.service
#查看服务器开放的端口命令
firewall-cmd --list-ports
#开放服务器9200和9300端口命令
firewall-cmd --add-port=9200/tcp
firewall-cmd --add-port=9300/tcp
再次启动,启动成功则访问浏览器访问ip:9200如下,表示成功

.
5.4检查集群部署成功与否
浏览器访问http://ip:9200/_cat/nodes,如下所示则成功

三、安装配置kinbana链接es
1.下载地址
下载地址https://www.elastic.co/cn/downloads/past-releases#kibana
注:下载和es版本一致
2.配置文件
#提供服务的端口,默认是5601
server.port: 5601
#主机地址,可以是ip、主机名
server.host: “192.168.10.101”
kibana访问es服务器的URL,可以有多个,以逗号","隔开
elasticsearch.hosts: [“http://192.168.10.101:9200”,’’http://192.168.10.102:9200’’,”http://192.168.10.101:9200”]
3.启动kibana
访问ip+端口哦5601
四、分词器
1.Es分词器类型

1.1标准分词器
Standard Analyzer(默认):
类型: standard
特点:
根据空格和标点符号分割文本
进行小写化处理
过滤符号
适用场景:适用于通用的全文搜索
1.2空格分词器
Whitespace Analyzer:
类型: whitespace
特点:
根据空格分割文本
不进行小写化
保留所有字符
适用场景:适用于不需要额外处理的精确匹配场景。
1.3简单分词器
Simple Analyzer:
类型: simple
特点:
按非字母切分
连续的数字为一个词条
进行小写处理
过滤符号
中文字单独建索引,并且把中文字转成拼音后也建搜索,这样就能同时支持中文和拼音检索。另外把拼音首字母也建索引,这样搜索 zjl 就能命中 “周杰伦”。
适用场景:适用一些简单的中文分词
1.4关键词分词器
Keyword Analyzer:
类型: keyword
特点: 将整个输入视为单个关键字,不进行分词。
适用场景:适用于不需要分词的场景,比如精确匹配。
1.5停用词分词器
Stop Analyzer:
类型: stop
特点:
去除停用词(is、a、the……)
根据空格分割文本
进行小写化处理。
适用场景:适用于需要去除常见停用词的场景。
1.6IK分词器
IK Analyzer:
类型:
ik_max_word :会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query
ik_smart:会做最粗粒度的拆分,不会对同一个词进行重复分词,适合 Phrase 查询
适用场景:适用于中文文本分析。
1.7NGram分词器
NGram Analyzer:
ngram 分词器的工作原理是将输入文本切分成一个个较小的子字符串,然后将这些子字符串作为词项添加到索引中类型
edge_ngram:从单词的开头提取 n-gram
ngram:在整个单词中提取 n-gram
适用场景:适用于前缀搜索和搜索建议
正则匹配分词器
Pattern Analyzer
类型:pattern
特点:根据正则匹配进行分词
1.8语言分词器
Language Analyzer
类型
english:英语分词器
french:法语分词器
特点:
支持多个不同国家语言的分词,但就是没有支持中文的(中文分词器还得靠国内大佬或机构开发)
应用英文的 Stop Analyzer(停用词过滤器)
单词小写化
不会过滤符号
适用场景:一些国际化的软件可能会用,但是面向国内用户基本上用不上
五、ik分词器
1.下载地址,选择和es同一版本
git clone https://github.com/medcl/elasticsearch-analysis-ik
git checkout tags/v7.10.0
mvn package
2.配置
将 target/releases/elasticsearch-analysis-ik-5.2.0.zip 拷贝到 es/plugins/ik 目录下
3.解压
在 es/plugins/ik 下对 elasticsearch-analysis-ik-5.2.0.zip 进行解压缩
4.重启es
5.ik分词器测试
GET /_analyze
{
“text”: “中华人民共和国国歌”,
“analyzer”: “ik_smart”
}
响应结果
{
“tokens”: [
{
“token”: “中华人民共和国”,
“start_offset”: 0,
“end_offset”: 7,
“type”: “CN_WORD”,
“position”: 0
},
{
“token”: “国歌”,
“start_offset”: 7,
“end_offset”: 9,
“type”: “CN_WORD”,
“position”: 1
}
]
}
6.扩展配置
IK分词器,支持两种算法。分别为:
ik_smart :最少切分
ik_max_word :最细粒度切分
配置文件都放在/plugins/ik/config 目录下,
7.自定义词典
在congif中,添加一个mydic.dic的文件,名字随意,后缀为dic;
在词典中添加自己所需要维护的词组,每个分词占一行

8.停用词词典
停用词:有些词在文本中出现的频率非常高。但对本文的语义产生不了多大的影响。例如英文的a、 an、the、of等。或中文的”的、了、呢等”。这样的词称为停用词。停用词经常被过滤掉,不会被进行索引。在检索的过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度,减少索引库文件的大小。

9.同义词词典
同义词:意思相同的,“番茄”和“西红柿”,查询“番茄”的时候,把带有“西红柿”的数据一起查出来,这种叫做同义词查询
在es的conf/analysis-ik/目录下创建一个文件synonym.txt,里面放置同义词词组,注:同一行为同一意思的词组
Eg:
番茄,西红柿,柿子
土豆,马铃薯
五、集成springboot
1.spring boot集成es有三种方式JAVA api 、REST client、Spring data es
Java API:部分弃用,高版本不推荐
REST client :REST Client有Java Low Level REST Client和Java Hight Level REST Client两个,前者兼容所有版本的ES,是基于HTTP通信,且自由性较高以及可以高亮查询(推荐)
Spring data es 封装性好,简单易上手,但是更新维护的版本比较慢
2.引入pom依赖
org.elasticsearch elasticsearch 7.10.0 org.elasticsearch.client elasticsearch-rest-client 7.10.0 org.elasticsearch.client elasticsearch-rest-high-level-client 7.10.0 ## 3.application.yml 配置 配置 spring: elasticsearch: rest: uris: 192.168.1.0:9200,192.168.1.1:9200,192.168.1.2:9200 ## 4.连接配置类 @Component public class EsConfig {@Value("${spring.elasticsearch.rest.uris}")
private String uris;
/**
* 高版本客户端
*
* @return
*/
@Bean
public RestHighLevelClient restHighLevelClient() {
String[] split = uris.split(",");
HttpHost[] httpHostArray = new HttpHost[split.length];
for (int i = 0; i < split.length; i++) {
String item = split[i];
httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
}
// 创建RestHighLevelClient客户端
return new RestHighLevelClient(RestClient.builder(httpHostArray));
}
}
5.查看索引是否存在
@Test
public void checkIndex() {
try {
String indexName = "forest";
boolean exists = esConfig.restHighLevelClient().indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
System.out.println("exists:" + exists);
} catch (IOException e) {
e.printStackTrace();
}
}
6.创建索引
public void createIndex() {
try {
// 创建名为“森林”的索引
String indexName = "forest";
if (checkIndex(indexName)) {
log.info("已存在名为{}的索引", indexName);
return;
}
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
CreateIndexResponse createIndexResponse = esConfig.restHighLevelClient().indices().create(createIndexRequest, RequestOptions.DEFAULT);
System.out.println("已创建索引:" + createIndexResponse.index());
} catch (IOException e) {
e.printStackTrace();
}
}
7.删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
AcknowledgedResponse response = esConfig.restHighLevelClient().indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
8.增加文档
获取索引信息,然后设置文档id,以及文档对象属性信息
IndexRequest indexRequest = new IndexRequest(indexName);
indexRequest.id(forestDoc.getId().toString());
indexRequest.source(JSON.toJSONString(Objct), XContentType.JSON);
// 设置数据刷新策略
indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
获取client新增数据
IndexResponse index = esConfig.restHighLevelClient().index(indexRequest, RequestOptions.DEFAULT);
注:刷新策略是根据实际情况去配置,es新增数据后最先是写入缓存中,需要间隔特定的时间然后才将缓存中的数据持久化到磁盘中,es默认的刷新时间为1s,可以在es设置索引mapping时指定默认刷新时间、还可以在新增数据的时候去手动刷新,具体如何设置以及设置时间根据具体的业务类型和业务需求设置,追求实时性可以直接新增提交数据的时候手动刷新就能立刻查询到数据,切记创建文档mapping的时候把刷新时间设置过短以及对频繁的提交手动刷新都会影响整体性能,一定要三思而后行!!!!!!!!!
9按主键更新文档内容
String indexName = "forest";索引名称
String id = "2";索引主键id
UpdateRequest updateRequest = new UpdateRequest(indexName, id);修改请求
Map<String, Object> map = new HashMap<>();
map.put("images", "http://baihuashu.jpg");
updateRequest.doc(map);
UpdateResponse update = esConfig.restHighLevelClient().update(updateRequest, RequestOptions.DEFAULT);
10.按主键删除数据
String indexName = "forest";索引名
String id = "5";索引主键id
DeleteRequest deleteRequest = new DeleteRequest(indexName,id);删除请求
DeleteResponse delete = esConfig.restHighLevelClient().delete(deleteRequest, RequestOptions.DEFAULT);
11.根据主键id获取文档内容
//创建查询对象,并指定索引和文档id
GetRequest request = new GetRequest("索引名", "主键id");
//根据相关信息查询文档是否存在
GetResponse response = esConfig.restHighLevelClient().get(request, RequestOptions.DEFAULT);
String sourceAsString = response.getSourceAsString();返回体内容
12.批量新增
//批量导入
BulkRequest bulk = new BulkRequest(indexName);
for (ForestDoc doc : list) {
IndexRequest indexRequest = new IndexRequest();
indexRequest.id(doc.getId().toString());
indexRequest.source(JSON.toJSONString(doc), XContentType.JSON);
bulk.add(indexRequest);
}
BulkResponse bulkResponse = esConfig.restHighLevelClient().bulk(bulk, RequestOptions.DEFAULT);
13.构建复杂查询
SearchRequest searchRequest = new SearchRequest("java_test");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
.........通过封装QueryBuilder条件来载入到sourcebuilder中最终请求查询es
SearchResponse searchResponse = esConfig.restHighLevelClient().search(searchRequest, RequestOptions.DEFAULT);
List<Object> list = JSON.toJSONString(searchResponse.getHits())
14.高亮查询
//查询条件(词条查询:对应ES query里的match)
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "华为手机");
//设置高亮三要素
// field: 你的高亮字段
// preTags :前缀
// postTags:后缀
HighlightBuilder highlightBuilder = new HighlightBuilder()
.field("title")
.preTags("<font color='blue'>")
.postTags("</font>");
// 构建查询源构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchQueryBuilder);
// 执行查询,然后处理响应结果
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT)
SearchHits hits = searchResponse.getHits();
Goods goods = JSON.parseObject(hit.getSourceAsString(), Goods.class);
// 获取高亮的数据
HighlightField highlightField = hit.getHighlightFields().get("title");
15.范围查询
// 构建查询条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.rangeQuery("price").gte(1000));
16.短语匹配matchphrase
match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置 与搜索词项相同的文档
“start_offset”: 0, 起始位置
“end_offset”: 5,结束位置
“type”: “”,
“position”: 1 各项词在原始字符串中的位置
短语匹配对于在字符中对位置敏感的搜索需求的时较为匹配
17.multi_match 查询多字段查询
GET /blog-posts/_search
{
"query": {
"multi_match" : {
"query": "use Elasticsearch multi-match queries",
"fields": ["title^3", "body"],
"type": "best_fields"
}
}
}
允许在一个或多个字段上执行全文本搜索,并合并各个字段的结果得分。这种查询有助于实现跨多个字段的统一搜索体验。
其指定的匹配类型有多种
best_fields:默认类型,选取匹配分数最高的那个字段的得分。
most_fields:综合所有字段的得分。
cross_fields:将所有字段当作一个大的字段来处理,进行跨字段的短语查询。
phrase:强制执行短语匹配。
phrase_prefix:类似于phrase,但是支持前缀匹配。
还可以设置单个字段的权重,从而影响得分判定,进而影响整个结果的一个排序
更多推荐


所有评论(0)