Elasticsearch入门笔记
1、安装Elasticsearch
代码语言:javascript复制下载elasticsearch7.8.0
## 下载elasticsearch7.8.0安装包,推荐使用华为云镜像下载速度快
ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D
logstash: https://mirrors.huaweicloud.com/logstash/?C=N&O=D
kibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D
elasticsearch-analysis-ik: https://github.com/medcl/elasticsearch-analysis-ik/releases
代码语言:javascript复制安装elasticsearch 使用非root用户、root用户不能启动elasticsearch
## 解压、配置环境变量 并进入elasticsearch目录下
cd /usr/elasticsearch
## 新建data文件夹和logs文件夹
mkdir data
mkdir logs
代码语言:javascript复制修改配置文件
## 修改elasticsearch.yml
vim elasticsearch.yml
## 修改内容:
cluster.name: elasticsearch
node.name: node1
path.data: /usr/elasticsearch/data
path.logs: /usr/elasticsearch/logs
http.port: 9200
network.host: master
cluster.initial_master_nodes: ["node1"]
## 修改jvm.options
vim jvm.options
修改-Xms1g 为 -Xms128m
修改-Xmx1g 为 -Xmx128m
## 因为是在虚拟机进行安装的ES,所以内存不是很大建议修改一下。若是生产环境不用修改。
代码语言:javascript复制运行
su hadoop ## 切换到非root用户
elasticsearch ## 启动es(前台启动)
elasticsearch -d ## 启动es(后台启动)
代码语言:javascript复制Web UI界面
master:9200
2、安装Head插件
0、最简单办法
代码语言:javascript复制谷歌插件安装es-head
## 谷歌应用商店地址:
https://chrome.google.com/webstore/category/extensions
## 搜索elasticsearch head安装即可
代码语言:javascript复制下载head的zip包
## 下载地址
https://github.com/mobz/elasticsearch-head
## 上传到服务器并解压
unzip elasticsearch-head-master.zip
mv ./elasticsearch-head-master /usr/elasticsearch
注意: Head插件不能放在ES的 plugins、modules目录下,否则ES启动会报错、这里我们放到/usr/elasticsearch目录下
1、安装node.js(如已安装可略过)
代码语言:javascript复制Head插件是依赖于node.js的。接下来先安装node.js
## 下载地址(中文网)速度较快
http://nodejs.cn/download/
## 下载linux版本,上传服务器并解压
tar xf node-v14.15.0-linux-x64.tar.xz
## 配置环境变量
/usr/node
## 测试
node -v
出现版本号即安装成功
2、升级gcc7.1(如无需升级则略过)
代码语言:javascript复制测试时可能会报错
## 报错信息:version `GLIBC_2.16' not found (required by node)
GLIBCXX 版本最高是13,而上面的错误信息中的14 15 18 没有,需要升级一下
# 下载gcc-7.1(有网盘链接)
## 链接:https://pan.baidu.com/s/1l0aqh4ZetlCn0YBLz7k4hA 提取码:nnxa
wget http://ftp.gnu.org/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2
## 解压 并进入
tar -jxvf gcc-7.1.0.tar.bz2
cd gcc-7.1.0
代码语言:javascript复制## 下载依赖库(时间大概二十分钟)
./contrib/download_prerequisites
## 建立编译输出目录
mkdir gcc-temp
## 生成makefile文件
./configure --enable-checking=release --enable-languages=c,c --disable-multilib
## 编译(j为核心数,速度会更快,这步极为耗时)
make -j4
## 安装命令
make install
## 如不报错则至此安装成功,一般程序安装在 /usr/local/bin/ 目录下
代码语言:javascript复制==注意:==执行make j4 的时候最后可能会报错:make[1]: *** [stage1-bubble] Error 2 make[1]: 报错后执行如下命令后再执行make j4,最后没有Error则继续执行下一步 安装命令 yum install -y glibc-headers gcc-c
替换当前gcc版本 :
## 倒数第三个是名字,倒数第二个参数为新GCC路径,最后一个参数40为优先级
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc 40
## 将原本的gcc重命名(删除亦可)
mv /usr/bin/gcc /usr/bin/gcc.bak
## 软连接使用gcc7.1版本
ln -s /usr/local/bin/x86_64-pc-linux-gnu-gcc /usr/bin/gcc
## 当前版本位于/usr/bin/gcc,执行以下命令验证
gcc -v
gcc 版本 7.1.0 (GCC)
## 版本显示为 7.1.0则升级成功!
3、升级GLIBCXX(如无需升级则略过)
代码语言:javascript复制继续如下操作,升级GLIBCXX
## 查看版本 现在为老版本
strings /usr/lib64/libstdc .so.6|grep GLIBCXX
## 进入老版本并移除
cd /usr/lib64
rm -rf libstdc .so.6
## 将新版本复制到当前目录
cp /usr/local/lib64/libstdc .so.6 ./
代码语言:javascript复制?思考:为什么要复制到当前目录
发现这个里面正是最新版本的动态库,可见,在升级gcc时,gcc编译会在gcc-temp目录中生成libstdc .so.6,升级完毕,默认只会在/usr/local/lib64目录下包含最新的libstdc .so.6动态库,而不会更新/usr/lib64目录下的libstdc .so.6。而执行程序时,程序会优先从/usr/lib64目录下去寻找libstdc .so.6,由于老版本的gcc在/usr/lib64中有一个旧版本的动态库libstdc .so.6,导致程序以为自己找到了正确的动态库,实际上找到的却不是最新的
代码语言:javascript复制## 查看版本
strings /usr/lib64/libstdc .so.6|grep GLIBCXX
## GLIBCXX最高版本23,满足要求了。再次运行node -v验证
## 此时继续报错
4、升级GLIBC(如无需升级则略过)
代码语言:javascript复制升级GLIBC版本,最高要求是17,我选择了17版本的,可以选更高点的 (已存网盘) ==链接:==https://pan.baidu.com/s/1Ax6AgtVTLMvLJOcccNM8Ww 提取码:13kx
## 解压
tar -xvf glibc-2.17.tar.gz
## 创建目录并进入
mkdir glibc-build-2.17
cd glibc-build-2.17
## 执行安装
../glibc-2.17/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make && make install
## 查看版本
strings /lib64/libc.so.6|grep GLIBC
GLIBC版本最高已达17,满足要求了
## 运行测试、看见版本号即成功
node -v
npm -v
5、继续安装Head插件
代码语言:javascript复制Grunt: 简而言之就是运行在node.js上面的任务管理器(task runner),其可以在任何语言和项目中自动化指定的任务,可通过npm来安装Grunt。是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,6.0里的Head插件就是通过Grunt启动的。因此还需要安装一下Grunt
## 首先切换至/usr/elasticsearch/elasticsearch-head-master目录下,并执行如下命令
cd /usr/elasticsearch/elasticsearch-head-master
npm install -g grunt-cli
## 上述命令执行后再执行如下命令,执行完后会生成一个node_modules目录
npm install
## 安装过程中可能会报缺少依赖的error,缺少哪个自行安装哪个即可
##至此安装成功
代码语言:javascript复制Head配置
## 1、修改服务器监听地址,增加hostname属性,
vim /usr/elasticsearch/elasticsearch-head-master/Gruntfile.js
修改为 hostname:'*',
代码语言:javascript复制## 修改head的连接地址,将localhost修改为ES的服务器地址(文件内容较多,建议打开文件通过查找关键字定位,如下图所示)
vim /usr/elasticsearch/elasticsearch-head-master/_site/app.js
6、启动Head
代码语言:javascript复制## 前台启动,先进入到head插件目录下
cd /usr/elasticsearch/elasticsearch-head-master
grunt server
## 后台启动
cd /usr/elasticsearch/elasticsearch-head-master
nohup grunt server &exit
代码语言:javascript复制此时访问es-head的Web UI界面显示未连接 由于ES进程和客户端进程端口号不同,存在跨域问题,所以我们要在ES的配置文件中配置下跨域问题:
## 进到elasticsearch的config目录下
cd /usr/elasticsearch/config
vim ./elasticsearch.yml
## 在最后添加如下配置信息
#跨域配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
:happy: 此时重新启动则正常
7、新建索引后集群健康状态为yellow
新建索引后如果健康状态为yellow则要检查是否新建的索引副本数大于elasticsearch的节点数,副本数应小于es的节点数
3、安装Kibana插件
代码语言:javascript复制安装、修改配置、启动
## 解压
## 位置随意,为了方便查找,将es的插件统一放到elasticsearch目录下
## 修改配置
cd /usr/elasticsearch/kibana/config
vim kibana.yml
server.host: "master"
elasticsearch.hosts: ["http://master:9200"]
elasticsearch.preserveHost: true
## 启动kibana(后台启动)
nohup ./bin/kibana &
代码语言:javascript复制kibana配置文件说明
server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号。
server.host: 默认值: "localhost" 指定后端服务器的主机地址。限制可访问的ip地址
server.name: 默认值: "您的主机名" Kibana 实例对外展示的名称。
server.defaultRoute: 默认值: "/app/kibana" Kibana 的默认路径,该配置项可改变 Kibana 的登录页面。
elasticsearch.url: 默认值: "http://localhost:9200" 用来处理所有查询的 Elasticsearch 实例的 URL 。
elasticsearch.preserveHost: 默认值: true 该设置项的值为 true 时,Kibana 使用 server.host 设定的主机名,该设置项的值为 false 时,Kibana 使用主机的主机名来连接 Kibana 实例。(域名控制)
kibana.index: 默认值: ".kibana" Kibana 使用 Elasticsearch 中的索引来存储保存的检索,可视化控件以及仪表板。如果没有索引,Kibana 会创建一个新的索引。
kibana.defaultAppId: 默认值: "discover" 默认加载的应用。
elasticsearch.username: 和 elasticsearch.password: Elasticsearch 设置了基本的权限认证,该配置项提供了用户名和密码,用于 Kibana 启动时维护索引。Kibana 用户仍需要 Elasticsearch 由 Kibana 服务端代理的认证。
pid.file: 指定 Kibana 的进程 ID 文件的路径。
logging.dest: 默认值: stdout 指定 Kibana 日志输出的文件。
logging.silent: 默认值: false 该值设为 true 时,禁止所有日志输出。
logging.quiet: 默认值: false 该值设为 true 时,禁止除错误信息除外的所有日志输出。
logging.verbose: 默认值: false 该值设为 true 时,记下所有事件包括系统使用信息和所有请求的日志。
ops.interval: 默认值: 5000 设置系统和进程取样间隔,单位微妙,最小值100。
代码语言:javascript复制kibana配置中文
中文包在 kibanax-packpluginstranslationstranslationszh-CN.json
## 修改配置文件 kibana.yml
i18n.locale: "zh-CN"
## 重启kibana即可成功
4、安装es-sql插件
0、安装web服务最简单办法
代码语言:javascript复制谷歌插件安装es-sql
## 安装包已上传至网盘
链接:https://pan.baidu.com/s/17RNZOnTsHjMsNWMDrk3CxA 提取码:gi2x
## 解压
## 打开谷歌浏览器进入扩展程序 并打开开发者模式
chrome://extensions/
## 点击左上角"加载已解压的扩展程序"
## 选择刚刚解压的文件夹即可
下载安装 ==注意:==插件版本需要与es版本对应 ==地址:==https://github.com/NLPchina/elasticsearch-sql/
1、下载安装
代码语言:javascript复制## 下载及安装
## 进入elasticsearch目录下
cd /usr/elasticsearch
## 执行命令等待安装完毕
./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.8.0.0/elasticsearch-sql-7.8.0.0.zip
2、下载页面需要的node.js文件
代码语言:javascript复制wget https://github.com/NLPchina/elasticsearch-sql/releases/download/5.4.1.0/es-sql-site-standalone.zip
## 解压
unzip es-sql-site-standalone.zip
## 进入site-server文目录
cd /usr/elasticsearch/site-server
## 执行如下操作
npm install express --save
## 启动命令
node node-server.js
elasticsearch-sql的默认端口是8080,可以在site-server/site_configuration.json文件中进行修改 然后 打开 http://localhost:8080/ 访问插件 注意修改右上角本地elasticsearch的地址,sql脚本不需要以分号“;”结尾,如果一个index有多个type,表名用indexName/typeName表示
5、Restful 风格语法
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有数据 |
代码语言:javascript复制数据类型
## 字符串类型
text 、 keyword
## 数值类型
long, integer, short, byte, double, float, half_float, scaled_float
## 日期类型
date
## te布尔值类型
boolean
## 二进制类型
binary
等等......
// PUT 创建索引 demo1索引 member类型 1 id
1、增
1、创建索引
代码语言:javascript复制创建索引
## 创建索引
PUT /demo1
## 创建索引指定设置:分片和副本
PUT /demo1
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
代码语言:javascript复制创建索引 指定type及字段 es7之后不建议自定义type,如需指定则需要include_type_name=true
## 指定type及字段 es7之后不建议自定义type,如需指定则需要include_type_name=true
PUT demo1?include_type_name=true
{
"settings":{
"number_of_shards":3,
"number_of_replicas":0
},
"mappings":{
"member":{
"properties":{
"name":{"type":"text"},
"age":{"type":"text"},
"country":{"type":"text"},
"date":{"type":"date"}
}
}
}
}
代码语言:javascript复制在索引中新增字段。结果可用
get demo1/_mapping
来查看,该字段下有数据时才能在head中查看到 我们使用PUT
方法,后面跟随我们的索引名称,再接上_mapping
,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword
index
索引为false
,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。
PUT demo1/_mapping
{
"properties": {
"member_id": {
"type": "keyword",
"index": false
}
}
}
2、插入数据
代码语言:javascript复制put方式插入 需要手动指定id,切id不重复,如果id重复则为覆盖
## 新增字段前
PUT demo1/member/2
{
"member":"shifafa",
"age":"18",
"country":"china",
"date":"2020-10-12"
}
## 新增字段后
PUT demo1/member/3
{
"member":"shifafa",
"age":"18",
"country":"china",
"date":"2020-10-12",
"member_id":"0001"
}
2、删
1、删除索引
代码语言:javascript复制DELETE /demo
## 返回结果
{"acknowledged" : true}
2、删除数据
代码语言:javascript复制根据id删除
DELETE /demo1/member/2
3、改
1、索引相关
代码语言:javascript复制修改索引的设置
PUT demo1/_settings
{
"number_of_replicas": 2
}
2、数据相关
代码语言:javascript复制更新数据
POST
我们使用POST
命令,在 id 后面跟_update
,要修改的内容放到doc
文档(属性)中即可。
POST demo1/member/3/_update
{
"doc":{
"member":"simple"
}
}
4、查
1、查看索引情况
代码语言:javascript复制## 查看我们所有索引的状态健康情况 分片,数据储存大小等等。
GET _cat/indices?v
2、条件查询
代码语言:javascript复制条件查询 _search?q=
GET demo1/member/_search?q=member:simple
代码语言:javascript复制构建查询
GET demo1/member/_search
{
"query":{
"match": {
"member": "simple"
}
}
}
代码语言:javascript复制查询全部(两种方式)
## 简单粗暴方法
GET demo1/member/_search
## 类似select * 方法
## match_all的值为空,表示没有查询条件,就像select * from table_name一样。
GET demo1/member/_search
{
"query":{
"match_all": {}
}
}
代码语言:javascript复制? 如果有个需求,我们仅是需要查看
member
和age
两个属性,其他的不要如何操作
GET demo1/member/_search
{
"query":{
"match_all": {}
},
"_source":["member","age"]
}
3、排序查询
代码语言:javascript复制在条件查询的基础上,我们又通过
sort
来做排序,排序对象是 age ,order
是desc
降序,asc
是升序。
## 降序
GET demo1/member/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"date": {
"order": "desc"
}
}
]
}
## 升序
GET demo1/member/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"date": {
"order": "desc"
}
}
]
}
4、分页查询
代码语言:javascript复制“from”: 0, # 从第n条开始 、 “size”: 1 # 返回n条数据
## 有始有终写法
GET demo1/member/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"date": {
"order": "asc"
}
}
],
"from":0, # 从第n条开始
"size":2 # 返回n条数据
}
## limit写法
GET demo1/member/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"date": {
"order": "asc"
}
}
],
"size":2 # 此时size就相当于limit
}