elasticsearch:7.7.1 使用详解(基于centos7笔记)
目录:
elasticsearch(非Docker安装)
elasticsearch(Docker安装)
elasticsearch数据结构和基本原理
elasticsearch基本 API 命令
elasticsearch(非Docker安装)
下载解压
过程不再多说了,直接镜像网站下载 .gz 包然后解压
elasticsearch目录介绍
bin 启动文件
config 配置文件
log4j2 日志配置文件
jvm.options java虚拟机参数配置
elasticsearch.yml elasticsearch的配置文件,默认9200端口,可能会涉及到跨域问题
lib 相关jar包
logs 日志
modules 功能模块
plugins 比如ik分词器
配置elasticsearch配置文件
1. elasticsearch本身配置文件配置
config目录下:
-
jvm.options:配置堆内存,Xms=256m Xmx=256m(可以根据自己的电脑性能来进行配置)
-
elasticsearch.yml配置文件中配置你的ip,这样的话可以让外网进行访问
2. elasticsearch对系统的配置同样也是有着苛刻的要求
2.1 首先对系统最大文件数量有要求(65536)
编辑配置文件
vi /etc/security/limits.conf
添加配置
* soft nofile 65536
* hard nofile 65536
然后重启linux或者重新登录 su root 或者其他用户使得配置文件生效
2.2 接着,对最大的线程同样有着要求(262144)
编辑配置文件
vi /etc/sysctl.conf
进行参数配置
vm.max_map_count=262144
最后使得配置生效
sysctl -p
3. 跨域的配置
config目录下的elasticsearch.yml配置跨域设置
# 设置全部ip都可以进行跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
启动elasticsearch
这个时候,elasticsearch启动不允许在root用户状态下面启动,需要在非root用户下启动,所以我们有需要有额外的配置了。
1. 我们先关闭防火墙,进行访问测试
systemctl stop firewalld
systemctl disable firewalld
2. 我们创建用户
groupadd es
useradd es -g es
chown -R es:es ./elasticsearch-7.7.1
3. 切换用户
su es
4. 进入bin目录进行启动
./elasticsearch
如果需要后台启动的话是下面这个命令
./elasticsearch -d
5. 访问效果如下
插件的安装(ik分词器)
1. 新建⽬录ik并且将分词器解压在这个目录下
cd /opt/elasticsearch/elasticsearch-7.7.1/plugins/elasticsearch-analysis-ik-7.7.1
mkdir ik
cd ik
2. 根据自己的版本选择对应的ik分词器,下面是官网的地址
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.1//elasticsearch-analysis-ik-7.7.1.zip
unzip elasticsearch-analysis-ik-7.7.1.zip
3. 启动后会有以下的效果
也可以通过下面的命令进行查看
elasticsearch-plugin list
[root@aa30c6c3d444 elasticsearch]# elasticsearch-plugin list
ik
4. 进入我们的kibana查看分词器的效果(如果没有安装图形界面请参照下面的教程)
GET _analyze
{
"analyzer":"ik_smart",
"text":"中国共产党"
}
最大拆分
GET _analyze
{
"analyzer":"ik_max_word",
"text":"中国共产党"
}
没有被拆分
GET _analyze
{
"analyzer":"keyword",
"text":"中国共产党"
}
标准拆分
GET _analyze
{
"analyzer":"standard",
"text":"中国共产党"
}
elasticsearch(Docker安装)
elasticsearch安装启动
话不多说,你只要安装了docker,下面一条命令就可以搞定了,配置一下内存(根据你的机器来配置)
如果没有安装,请参照网址
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 \
-v elasticsearch7.0:/usr/local/elasticsearch \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.7.1
kibana安装启动
docker run \
-it \
--name kibana \
-p 5601:5601 \
kibana:7.7.1 \
bin/bash
进入命令行配置kibana的配置文件
[root@iZ2ze1ycujbqzy1mnrzufbZ ~]# docker exec -it 3b239fff5b6e /bin/bash
bash-4.2$ ls
kibana.yml
bash-4.2$ vi kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://59.110.213.92:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
然后我们直接通过:http://你的ip:5601 进行访问
可视化界面的安装的补充
1. 我们可以选择head插件
这里需要一些前端的安装环境
如果没有git,直接进行下载
yum install git
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/
连接测试,需要配置我们elasticsearch的跨域
2. ElisticHD,更加可视化的界面
这里我们演示docker安装
docker run \
-p \
9200:9200 \
-d \
--name elasticsearch01 \
elasticsearch
docker run \
-p 9800:9800 \
-d \
--link elasticsearch01 \
containerize/elastichd
elasticsearch数据结构和基本原理
数据结构
这里和MySQL有着非常相似的关系
database --> indices 索引
tables --> types 类型(这个可能描述的不太准确,type更加类似于java中的class)
rows --> documents 文档
columns --> field 字段
启动elasticsearch之后就是以集群的方式进行工作
elasticsearch把后台的每个索引划分为了多个分片,每个分片可以在集群中的不同服务器间迁移。所以我们一开始就是搭建了一个集群,虽然看上去是单机的安装。
一个集群至少有一个节点,一个节点就是一个elasticsearch进程,节点可以有多个索引,如果你创建了一个索引,那么索引将会有5个分片,每一个主分片都会有一个副本。
elasticsearch基本 API 命令
入门命令演示
1. 创建一个文档
PUT /索引名/类型名/文档id {请求体}
PUT /test/type1/1
{
"name":"zhangsan",
"age":3
}
2. 创建一个索引
PUT /test2
{
"mappings":{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"long"
},
"birthday":{
"type":"date"
}
}
}
}
GET test2
3. 查看默认信息
PUT /test3/_doc/1
{
"name":"zhangsan",
"age":21,
"birth":"1997-01-05"
}
GET test3
4. 获取索引详细信息
GET _cat/indices?v
数据类型
字符串类型
text 、 keyword
数值类型
long, integer, short, byte, double, float, half_float, scaled_float
日期类型
date
PUT /索引名/类型名/文档id {请求体}
te布尔值类型
boolean
二进制类型
binary
等等…
命令进阶
增加数据
1. 添加数据
PUT /alibaba/user/1
{
"name":"zhangsan",
"age":21,
"desc":"我是张三",
"tags":["开发","专家"]
}
PUT /alibaba/user/2
{
"name":"lisi",
"age":22,
"desc":"我是李四",
"tags":["jvm","docker"]
}
2. 数据获取 GET
GET /alibaba/user/1
GET /alibaba/user
修改数据,删除数据
1. 更新数据 PUT
PUT /alibaba/user/1
{
"name":"zhangsan:new",
"age":21,
"desc":"我是张三",
"tags":["开发","专家"]
}
GET /alibaba/user/1
2. 更灵活的更新方式(推荐使用) POST _update
POST /alibaba/user/1/_update
{
"doc":{
"name":"ZHANGSAN:new"
}
}
GET /alibaba/user/1
查询数据
1. 简单搜索
GET /alibaba/user/1
2. 条件查询
GET /alibaba/user/_search?q=name:lisi
3. 复杂条件查询
3.1 通过字段进行过滤
GET alibaba/user/_search
{
"query":{
"match":{
"name":"lisi"
}
}
}
3.2 对字段结果进行过滤,返回部分字段
GET alibaba/user/_search
{
"query":{
"match":{
"name":"lisi"
}
},
"_source":["name","desc"]
}
3.3 对结果进行排序
GET alibaba/user/_search
{
"sort":[
{
"age":{
"order":"asc"
}
}
]
}
3.4 分页查询
GET alibaba/user/_search
{
"from":0,
"size":1
}
3.3 布尔查询,逻辑判断查询(& | !)
bool 表示返回满足所有条件的结果
must 表示 and(&)
should 表示 or(|)
must_not 表示 not(!)
GET alibaba/user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"lisi"
}
},
{
"match":{
"age":"21"
}
}
]
}
}
}
GET alibaba/user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"lisi"
}
},
{
"match":{
"age":"22"
}
}
]
}
}
}
3.4 过滤器(< > =)
类似于比较运算符
gt 大于
gte 大于等于
lt 小于
lte 小于等于
GET alibaba/user/_search
{
"query":{
"bool":{
"filter":{
"range":{
"age":{
"gt":20,
"lt":22
}
}
}
}
}
}
4. 精确查询
term查询时直接通过倒排索引指定的词条进程精确查找的
-
term,直接查询精确的
-
match,会使用分词器解析(先分析文档,然后在分析的结果中进行查询)
多个词精确匹配
GET /alibaba/user
{
"query":{
"bool":{
"should":{
"term":{
"age":"22"
},
"term":{
"age":"21"
}
}
}
}
}
分词分析后在进行分析(就是经过了我们的ik分词器分词之后再对分词之后的结果进行查询)
GET alibaba/user/_search
{
"query":{
"match":{
"desc":"李"
}
},
"_source":["name","desc"]
}
5. 高亮查询
5.1 默认高亮显示
GET alibaba/user/_search
{
"query":{
"match":{
"desc":"李"
}
},
"highlight":{
"fields":{
"desc":{}
}
},
"_source":["desc"]
}
5.2 自定义高亮显示
GET alibaba/user/_search
{
"query":{
"match":{
"desc":"李"
}
},
"highlight":{
"pre_tags":"<p class='key' style='color:red'>",
"post_tags":"</p>",
"fields":{
"desc":{}
}
},
"_source":["desc"]
}
6. 关于MySQL和elasticsearch
其实elasticsearch的这些功能MySQL都可以实现,但是只不过效率会比较的低。