ElasticSearch 7.x 安装及其使用
一,安装
elasticsearch 下载地址: https://www.elastic.co/cn/downloads/elasticsearch
kibana 下载地址: https://www.elastic.co/cn/downloads/kibana
可视化工具 elasticsearch-head : https://github.com/mobz/elasticsearch-head
ik分词插件: https://github.com/medcl/elasticsearch-analysis-ik/
以上程序官方都可以提供了docker安装方式
1,创建用户并启动es
注意1:ES启动默认会占用1G以上 内存 修改
config/jvm.options
下的-Xms512m
-Xmx1g
参数
注意1:es5之后的都不能使用添加启动参数或者修改配置文件等方法启动了,必须要创建用户 。启动报错,以及一些坑爹结果办法
创建用户:
#添加用户
adduser elasticsearch
#设置密码
passwd elasticsearch
#授权
chown -R elasticsearch elasticsearch-7.6.2
su elasticsearch
#启动
bin/elasticsearch
启动成功后就可以在访问127.0.0.1:9200
响应了json数据。
后台运行以及停止:
#-d 守护进程启动;-p 指定保存pid的文件名称
bin/elasticsearch -d -p pid.txt
#停止
pkill -F pid
https://www.elastic.co/guide/en/elasticsearch/reference/current/starting-elasticsearch.html
2,安装elasticsearch-head
下载项目代码到本地,然后在项目根目录npm install
,然后npm run start
即可。
跨域问题以及如何外网访问,修改配置文件config/elasticsearch.yml
network.host: 0.0.0.0 # 内外网都可以访问,默认就127.0.0.1:9200可以
#以下两个配置是安装elasticsearch-head需要配置的跨域
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# # 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"
3,安装kibana
解压压缩包,修改config/kibana.yml
中的es主机地址(字段elasticsearch.hosts
),然后运行bin
目录下的可执行文件,自带了node环境。
访问地址http://localhost:5601/ 默认打开是英文的,可以配置为中文,修改kibana.yml
中的i18n.locale
字段的值为zh-CN
linux下可以使用rpm的安装方式来后台,或者安装service,或者nohup bin/kibana >> /dev/null 2>&1 &
*停止:查询pid然后kill ps -ef | grep kibana*
默认只能本地访问,修改配置文件kibana.yml
中的server.host: "0.0.0.0"
https://www.elastic.co/guide/en/kibana/current/rpm.html
4,安装创建ik分词器
解压后将所有文件放到elasticsearch的plugins/ik/
目录下。
二,使用
1,elasticsearch
基本概念
mysql | elasticsearch |
---|---|
database | index |
table | type(类型),7.x标记为过时,8.x会本剔除 |
rows | document |
column | file |
schema | mapping |
2,ik分词器
GET _analyze
{
"analyzer": "ik_smart",
"text": "使用编辑器键入请求并将它们提交到 Elasticsearch"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "使用编辑器键入请求并将它们提交到 Elasticsearch"
}
ik分词器的两个算法ik_max_word
和ik_smart
;ik_max_word
最大分词,尽可能的多的拆分出词。ik_smart
智能分词。
ik分词器添加自定义字典:
在plugins/ik/config/
目录下创建mydict.dic
文件,在里面写自定义的词,一行一个。修改同级目录下的IKAnalyzer.cfg.xml
配置文件,添加<entry key="ext_dict">mydict.dic</entry>
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">mydict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
3,Rest风格操作
方法 | url | 描述 |
---|---|---|
PUT | hotstname:9200/索引名称/类型名称/文档id | 创建文档并指定id |
POST | hotstname:9200/索引名称/类型名称 | 创建文档(随机id) |
POST | hotstname:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | hotstname:9200/索引名称/类型名称/文档id | 删除文档 |
GET | hotstname:9200/索引名称/类型名称/文档id | 通过id查询文档 |
POST | hotstname:9200/索引名称/类型名称/_search | 查询所有数据 |
官网文档地址 https://www.elastic.co/guide/en/elasticsearch/reference/7.6/rest-apis.html
ex:
3.1,增删改
创建
PUT /test/type1/2
{
"name":"张三",
"age":"109"
}
查询
GET /test/type1/2
PUT my_index
{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
修改
POST /test/type1/2/_update
{
"doc":{
"name":"张三三"
}
}
删除
DELETE /test2
关键字数据类型 https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html
keyword类型的不会被解析拆分
3.2,查询
查询官网的详细文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
添加一些数据
PUT /studyes/users/1
{
"name":"Ruanun",
"age":13,
"desc":"一顿操作猛如虎,一看工资2500。",
"tags":["java", "宅", "影视", "直男"]
}
PUT /studyes/users/2
{
"name":"张三",
"age":19,
"desc":"法外狂徒。",
"tags":["吊炸天", "活泼"]
}
PUT /studyes/users/3
{
"name":"大漠",
"age":3,
"desc":"木瓜大盗",
"tags":["吊炸天", "活泼"]
}
PUT /studyes/users/4
{
"name":"张五",
"age":6,
"desc":"张武很牛逼",
"tags":["吊炸天"]
}
简单查询
GET /studyes/users/_search?q=name:张
_score字段,表示成绩,匹配度。越大越匹配。
结果:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.6548753,
"hits" : [
{
"_index" : "studyes",
"_type" : "users",
"_id" : "2",
"_score" : 0.6548753,
"_source" : {
"name" : "张三",
"age" : 19,
"desc" : "法外狂徒。",
"tags" : [
"吊炸天",
"活泼"
]
}
},
{
"_index" : "studyes",
"_type" : "users",
"_id" : "4",
"_score" : 0.6548753,
"_source" : {
"name" : "张五",
"age" : 6,
"desc" : "张武很牛逼",
"tags" : [
"吊炸天"
]
}
}
]
}
}
过滤额结果字段:
GET /studyes/users/_search
{
"query": {
"match": {
"name": "张三"
}
}
, "_source": ["name", "age"]
}
只显示name,age字段。
排序:
GET /studyes/users/_search
{
"query": {
"match": {
"name": "张三"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
age字段降序
分页:
"from": 0, 从哪一条开始
"size": 20,每一页多少条记录
多个条件:
GET /studyes/users/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": 9
}
}
]
}
}
}
must(and):并且的条件;should(or):或者;must_not(not):不是xxx。
过滤:
GET /studyes/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 1,
"lte": 200
}
}
}
]
}
}
}
age:1~200
gt 大于,gte 大于等于,lt 小于,lte 小于等于!
多个条件,满足一个就ok:以空格分隔
GET /studyes/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"tags": "吊 男"
}
}
]
}
}
}
match:会使用分词器解析;term :直接查询精确的
查询结果高亮(highlight):
GET /studyes/_search
{
"query": {
"match": {
"name": "张"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
默认是家里em标签"<em>张</em>三三"
自定义高亮标签:
GET /studyes/_search
{
"query": {
"match": {
"name": "张"
}
},
"highlight": {
"fields": {
"name": {}
},
"pre_tags": "<p class='highlight' style='color:red'>",
"post_tags": "</p>"
}
}
结果: "<p class='highlight' style='color:red'>张</p>三"
4,客户端
es官方文档:https://www.elastic.co/guide/en/elasticsearch/client/index.html
springboot引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
注意修改版本,保持和你安装的es版本一直
<elasticsearch.version>7.6.2</elasticsearch.version>
目前网络上的教程几乎都是使用es的transportClient,但是在es8开始就废弃transportClient了。目前推荐使用restClient进行增删改查。
application.yml中配置信息:
spring:
elasticsearch:
rest:
uris: http://192.168.18.137:9200
connection-timeout: 5s
read-timeout: 30s
urls
是list,支持配置多个。uris: ["http://192.168.18.137:9200", "http://192.168.18.137:9200"]
网搜到的教程基本都是spring.data.elasticsearch.cluster-nodes
这样配置的,这个已经过时了。
- 使用时实现ElasticsearchCrudRepository接口来操作,复杂的使用ElasticsearchRestTemplate
- 在使用es7的时候统一使用ElasticsearchRestTemplate或者ElasticsearchCrudRepository来操作。也不要使用ElasticsearchTemplate。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。