4.3启动ES服务
三台机器使用baiqi用户执行以下命令启动es服务
nohup /usr/local/es/elasticsearch‐7.6.1/bin/elasticsearch 2>&1 &
启动成功之后jsp即可看到es的服务进程,并且访问页面
http://127.0.0.1:9200/?pretty
能够看到es启动之后的一些信息
注意:如果哪一台机器服务启动失败,那么就到哪一台机器的
/usr/local/es/elasticsearch‐7.6.1/log
这个路径下面去查看错误日志
# 注意:防火墙涉及到系统安全,如有必要请咨询 devops, ops # 关闭 Linux 防火墙 # 永久性生效,重启后不会复原 开启:chkconfig iptables on 关闭:chkconfig iptables off # 即时生效,重启后复原 开启:service iptables start 关闭:service iptables stop
注意:启动ES的时候出现 Permission denied
原因:当前的用户没有对XX文件或目录的操作权限
5.客户端Kibana安装
5.1客户端可以分为图形界面客户端,和代码客户端.
5.2ES主流客户端Kibana,开放9200端口与图形界面客户端交互
1)下载Kibana放之/usr/local/es目录中
2)解压文件:tar -zxvf kibana-X.X.X-linux-x86_64.tar.gz
3)进入/usr/local/es/kibana-X.X.X-linux-x86_64/config目录
4)使用vi编辑器:vi kibana.yml
server.port: 5601 server.host: "0.0.0.0" # es 服务器的 ip 和端口 elasticsearch.hosts: ["http://localhost:9200"]
5)启动Kibana
./kibana
6)访问Kibana
http://127.0.0.1:5601/app/kibana
6.安装IK分词器
我们后续也需要使用Elasticsearch来进行中文分词,所以需要单独给Elasticsearch 安装IK分词器插件。以下为具体安装步骤:
6.1下载Elasticsearch IK分词器
6.2切换到 hxl 用户,并在es的安装目录下/plugins创建ik
mkdir ‐p /usr/local/es/elasticsearch‐7.6.1/plugins/ik
6.3将下载的ik分词器上传并解压到该目录
cd /usr/local/es/elasticsearch‐7.6.1/plugins/ik unzip elasticsearch‐analysis‐ik‐7.6.1.zip
6.4重启Elasticsearch
6.5 测试分词效果
POST _analyze { "analyzer":"standard", "text":"我爱你中国" } #ik_smart:会做最粗粒度的拆分 POST _analyze { "analyzer": "ik_smart", "text":"中华人民共和国" } #ik_max_word: 会将文本做最细粒度的拆分 POST _analyze { "analyzer":"ik_max_word", "text":"我爱你中国" }
7.指定IK分词器作为默认分词器
ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如我搜索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,然后搜出来的都是些“清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔”之类的莫名其妙的结果,这里我们就想把这个分词方式修改一下,于是呢,就想到了ik分词器,有两种ik_smart和ik_max_word。
ik_smart会将“清华大学”整个分为一个词,而ik_max_word会将“清华大学”分为“清华大学”,“清华”和“大学”,按需选其中之一就可以了。
修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):
PUT /school_index { "settings" : { "index" : { "analysis.analyzer.default.type": "ik_max_word" } } }
8.ES数据管理
8.1ES数据管理概述
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。ES使用JSON作为文档序列化格式。
JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。ES存储的一个员工文档的格式示例:
{ "email" : "zhangsan@hw.cn", "name" : "张三", "age" : 32, "interests" : ["篮球", "足球"] }
8.2基本操作
1)创建索引
格式: PUT /索引名称
PUT /es_db
2)查询索引
格式: GET /索引名称
GET /es_db
3)删除索引
格式: DELETE /索引名称
DELETE /es_db
4)添加文档
格式: PUT /索引名称/类型/id
PUT /es_db/_doc/1 { "name":"张三", "sex":1, "age":25, "address":"广州天河公园", "remark":"java developer" } PUT /es_db/_doc/2 { "name": "李四", "sex": 1, "age": 28, "address": "广州荔湾大厦", "remark": "java assistant" } PUT /es_db/_doc/3 { "name": "rod", "sex": 0, "age": 26, "address": "广州白云山公园", "remark": "php developer" } PUT /es_db/_doc/4 { "name": "admin", "sex": 0, "age": 22, "address": "长沙橘子洲头", "remark": "python assistant" } PUT /es_db /_doc /5 { "name": "小明", "sex": 0, "age": 19, "address": "长沙岳麓山", "remark": "java architect assistant" }
5) 修改文档
格式: PUT /索引名称/类型/id 举例: PUT /es_db/_doc/1 { "name": "张飞", "sex": 1, "age": 25, "address": "张家界森林公园", "remark": "php developer assistant" }
**可能出现的问题: **
重启服务可能遇到的问题:TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block,可以参考下面配置。
关键的参数cluster.routing.allocation.disk.threshold_enabled
(es可以根据磁盘使用情况来决定是否继续分配shard。默认设置是开启的).
为了在本地单机上测试,我自己电脑磁盘空间剩下没多少了,修改elasticsearch.yml,设置cluster.routing.allocation.disk.threshold_enabled: false。
如果后续虚拟机磁盘空间不够,启动失败了可以删除了data,logs里的文件。
问题:
ES插入大量的数据时报错:TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block 的解决方法
原因:
是因为一次请求中批量插入的数据条数巨多,以及短时间内的请求次数巨多引起ES节点服务器内存超过限制,ES主动给索引上锁。
解决办法:
PUT _all/_settings { "index.blocks.read_only_allow_delete": null }
6) 查询文档
格式: GET /索引名称/类型/id GET /es_db/_doc/1
7)删除文档
格式: DELETE /索引名称/类型/id DELETE /es_db/_doc/2 # 如果是 PowerShell 可以使用下面的请求命令 curl -uri 'http://localhost:9200/es_db/_doc/2' -method 'DELETE'
9.Restful认识
Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP 动词(GET,POST,DELETE,PUT)描述操作。 基于Restful API ES和所有客户端的交互都是使用JSON格式的数据.
其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信
GET 查询
PUT 添加
POST 修改
DELETE 删除
用户做 crud
Get http://localhost:8080/employee/1 Get http://localhost:8080/employees put http://localhost:8080/employee { } delete http://localhost:8080/employee/1 Post http://localhost:8080/employee/1 { }
使用Restful的好处:
透明性,暴露资源存在。
充分利用 HTTP 协议本身语义,不同请求方式进行不同的操作
10.查询操作
10.1查询当前类型中的所有文档 _search
格式: GET /索引名称/类型/_search 举例: GET /es_db/_doc/_search SQL: select * from student
10.2条件查询, 如要查询age等于28岁的 _search?q=:**
格式: GET /索引名称/类型/_search?q=*:*** 举例: GET /es_db/_doc/_search?q=age:28 SQL: select * from student where age = 28
10.3范围查询, 如要查询age在25至26岁之间的 _search?q=[** TO **] 注意: TO 必须为大写
格式: GET /索引名称/类型/_search?q=***[1 TO 100] 举例: GET /es_db/_doc/_search?q=age[1 TO 100] SQL: select * from student where age between 1 and 100
10.4根据多个ID进行批量查询 _mget
格式: GET /索引名称/类型/_mget 2 举例: GET /es_db/_doc/_mget { "ids":["1","2"] } SQL: select * from student where id in (1,2)
10.5查询年龄小于等于28岁的 :<=
格式: GET /索引名称/类型/_search?q=age:<=** 举例: GET /es_db/_doc/_search?q=age:<=28 SQL: select * from student where age <= 28
10.6查询年龄大于28前的 :>
格式: GET /索引名称/类型/_search?q=age:>** 举例: GET /es_db/_doc/_search?q=age:>28 SQL: select * from student where age > 28
10.7分页查询 from=&size=
格式: GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1 举例: GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1 SQL: select * from student where age between 25 and 26 limit 0, 1
10.8对查询结果只输出某些字段 _source=字段,字段
格式: GET /索引名称/类型/_search?_source=字段,字段 举例: GET /es_db/_doc/_search?_source=name,age SQL: select name,age from student
10.9对查询结果排序 sort=字段:desc/asc
格式: GET /索引名称/类型/_search?sort=字段 desc 举例: GET /es_db/_doc/_search?sort=age:desc SQL: select * from student order by age desc