Elasticsearch学习随笔

2021-04-09 11:32:32 浏览数 (1)

Elasticsearch入门笔记

1、安装Elasticsearch

下载elasticsearch7.8.0

代码语言:javascript复制
## 下载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

安装elasticsearch 使用非root用户、root用户不能启动elasticsearch

代码语言:javascript复制
## 解压、配置环境变量 并进入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(后台启动)

Web UI界面

代码语言:javascript复制
master:9200

2、安装Head插件

0、最简单办法

谷歌插件安装es-head

代码语言:javascript复制
## 谷歌应用商店地址:
https://chrome.google.com/webstore/category/extensions
## 搜索elasticsearch head安装即可

下载head的zip包

代码语言:javascript复制
## 下载地址
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(如已安装可略过)

Head插件是依赖于node.js的。接下来先安装node.js

代码语言:javascript复制
## 下载地址(中文网)速度较快
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/ 目录下

==注意:==执行make j4 的时候最后可能会报错:make[1]: *** [stage1-bubble] Error 2 make[1]: 报错后执行如下命令后再执行make j4,最后没有Error则继续执行下一步 安装命令 yum install -y glibc-headers gcc-c

替换当前gcc版本 :

代码语言:javascript复制
## 倒数第三个是名字,倒数第二个参数为新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(如无需升级则略过)

继续如下操作,升级GLIBCXX

代码语言:javascript复制
## 查看版本 现在为老版本
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(如无需升级则略过)

升级GLIBC版本,最高要求是17,我选择了17版本的,可以选更高点的 (已存网盘) ==链接:==https://pan.baidu.com/s/1Ax6AgtVTLMvLJOcccNM8Ww 提取码:13kx

代码语言:javascript复制
## 解压
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插件

Grunt: 简而言之就是运行在node.js上面的任务管理器(task runner),其可以在任何语言和项目中自动化指定的任务,可通过npm来安装Grunt。是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,6.0里的Head插件就是通过Grunt启动的。因此还需要安装一下Grunt

代码语言:javascript复制
## 首先切换至/usr/elasticsearch/elasticsearch-head-master目录下,并执行如下命令
cd /usr/elasticsearch/elasticsearch-head-master
npm install -g grunt-cli
## 上述命令执行后再执行如下命令,执行完后会生成一个node_modules目录
npm install
## 安装过程中可能会报缺少依赖的error,缺少哪个自行安装哪个即可
##至此安装成功

Head配置

代码语言:javascript复制
## 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

此时访问es-head的Web UI界面显示未连接 由于ES进程和客户端进程端口号不同,存在跨域问题,所以我们要在ES的配置文件中配置下跨域问题:

代码语言:javascript复制
## 进到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 &

kibana配置文件说明

代码语言:javascript复制
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。

kibana配置中文

代码语言:javascript复制
中文包在 kibanax-packpluginstranslationstranslationszh-CN.json
## 修改配置文件 kibana.yml 
i18n.locale: "zh-CN"

## 重启kibana即可成功

4、安装es-sql插件

0、安装web服务最简单办法

谷歌插件安装es-sql

代码语言:javascript复制
## 安装包已上传至网盘
链接: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
  }
}

创建索引 指定type及字段 es7之后不建议自定义type,如需指定则需要include_type_name=true

代码语言:javascript复制
## 指定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"}
     }
   }
 }
}

在索引中新增字段。结果可用get demo1/_mapping来查看,该字段下有数据时才能在head中查看到 我们使用PUT方法,后面跟随我们的索引名称,再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。

代码语言:javascript复制
PUT demo1/_mapping
{
  "properties": {
    "member_id": {
      "type": "keyword",
      "index": false
    }
  }
}

2、插入数据

put方式插入 需要手动指定id,切id不重复,如果id重复则为覆盖

代码语言:javascript复制
## 新增字段前
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、删除数据

根据id删除

代码语言:javascript复制
DELETE /demo1/member/2

3、改

1、索引相关

修改索引的设置

代码语言:javascript复制
PUT demo1/_settings
{
  "number_of_replicas": 2
}

2、数据相关

更新数据POST 我们使用POST命令,在 id 后面跟 _update,要修改的内容放到doc 文档(属性)中即可。

代码语言:javascript复制
POST demo1/member/3/_update
{
  "doc":{
    "member":"simple"
  }
}

4、查

1、查看索引情况

代码语言:javascript复制
## 查看我们所有索引的状态健康情况 分片,数据储存大小等等。
GET _cat/indices?v

2、条件查询

条件查询 _search?q=

代码语言:javascript复制
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": {}
  }
}

? 如果有个需求,我们仅是需要查看 member age 两个属性,其他的不要如何操作

代码语言:javascript复制
GET demo1/member/_search
{
  "query":{
    "match_all": {}
  },
  "_source":["member","age"]
}

3、排序查询

在条件查询的基础上,我们又通过sort 来做排序,排序对象是 age , orderdesc降序,asc是升序。

代码语言:javascript复制
## 降序
GET demo1/member/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ]
}

## 升序
GET demo1/member/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    }
  ]
}

4、分页查询

“from”: 0, # 从第n条开始 、 “size”: 1 # 返回n条数据

代码语言:javascript复制
## 有始有终写法
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
}

0 人点赞