起因:在项目开发过程中,要使用到搜索 引擎来对一些关键字实现逆向查询,如果仅用模糊搜索,那么搜索的时间会根据数据量的增大而增大,对比之下就学了elasticsearch,也记录一下,常常回顾。
1. ElasticSearch单机部署安装
# 下载地址
# 官方网站进行下载:https://www.elastic.co/cn/downloads/elasticsearch
#https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-5-2
# https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.2-linux-x86_64.tar.gz
# 加压命令 tar -zxvf 压缩格式 解压 详细信息 文件夹
# elasticsearch-7.5.2-linux-x86_64.tar.gz
# ES整体的生态强依赖于ES的主版本,如果要安装logstash、kibana、中文分词器
# 创建两个文件夹
mkdir /usr/local/elasticsearch/esdata
mkdir /usr/local/elasticsearch/eslogs
# 修改ES config目录下的elasticsearch.yml
vi elasticsearch.yml
cluster.name: icoding-es #给集群设置一个名字,如果是集群,所有在这个集群中的节点集群名都要一样
node.name: es-node-1 #如果是集群,集群中每个节点的名字都不能一样
path.data: /usr/local/elasticsearc/mkdata
path.logs: /usr/local/elasticsearc/mklogs
network.host: 0.0.0.0
http.port: 9200 #服务端口,通信端口是9300
cluster.initial_master_nodes: ["es-node-1"] #master节点服务发现,和上面的节点名一致
启动elasticsearch
# 在bin目录下
# org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
# 不能用root启动
adduser esuser
# 给esuser授权 /usr/local/elasticsearch 目录的权限
chown -R esuser:esuser /usr/local/elasticsearch/
su esuser
./elasticsearch
# ERROR: [1] bootstrap checks failed
# [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
# 修改一下内容需要root用户
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf
vm.max_map_count=262145
sysctl -p
su esuser
./elasticsearch #在线启动
./elasticsearch -d
9200:http协议,用于外部通信,提供服务
9300:Tcp协议,ES集群之间及内部服务通信的端口
2. 界面插件ElasticSearch-Head/Kibana使用
2.1. head安装
elasticsearch-head
GitHub: https://github.com/mobz/elasticsearch-head
cd elasticsearch-head
installment--registry=https://registry.npm.taobao.org
npm run start
# 启动后本地访问及端口:http://localhost:9100
安装完毕后访问会提升不允许跨域
# No 'Access-Control-Allow-Origin'
# 在elasticsearch.yaml里加入
http.cors.enabled: true
http.cors.allow-origin: "*"
2.2. kibana安装
# 下载地址
https://artifacts.elastic.co/downloads/kibana/kibana-7.5.2-linux-x86_64.tar.gz
vi kibana.yml
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.0.143:9200"]
# 进入bin目录
# Kibana should not be run as root. Use --allow-root to continue.
# chown -R esuser:esuser /usr/local/software/kibana-7.5.2-linux-x86_64
# 端口默认是5601
./kibana
nohup ./kibana &
3. 索引创建的基本操作
索引创建创建了3个分片,每个分片0个备份节点
获取集群健康值
GET http://127.0.0.1/_cluster/health
{
"cluster_name": "icoding-es",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 1,
"active_shards": 1,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}
删除索引
DELETE /index_test
创建索引
PUT /index_test1
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "0"
}
}
}
查询索引的相关信息
GET http://39.100.156.225:9200/_cat/indices?v
4. mappings自定义创建设置与analyze
mappings自定义创建
PUT /index_test2
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "0"
}
},
"mappings": {
"properties": {
"username": {
"type": "text",
"index": true
},
"password": {
"type": "keyword",
"index": false
}
}
}
}
analyze分词器的使用
GET /index_test2/_analyze
{
"field": "text",
"text": "icoding is very well!"
}
mappings映射的type的类型都有哪些
-
text,keywork
-
long,integer,short,byte
-
double,float
-
boolean
-
date
字符串
-
text:文字类型,内容需要被分词被倒排索引
-
keyword:文字类型,不会被分词,精确匹配,比如qq号,微信号
如果在创建完索引后没有创建mapping,可以后续添加
POST /index_test3/_mapping
{
"properties": {
"username": {
"type": "text",
"index": true
},
"password": {
"type": "keyword",
"index": false
}
}
}
5. document文档增删改查与乐观锁
# 作为索引来讲,他更关心的是doc,而mapping没有,他会默认方式来添加
POST /index_test3/_doc/2
{
"id": 1001,
"name": "icoding-elasticsearch",
"desc": "非常不错,很好",
"create_date": "2020-2-15"
}
# 查询
GET /index_test3/_doc/2
# 删除
DELETE /index_test3/_doc/2
# 更新
POST /index_test3/_doc/1/_update
{
"doc": {
"desc": "架构师课程非常不错"
}
}
查询的元数据类型
"_index": "index_test3", #属于哪个索引
"_type": "_doc", #type类型,7.x固定是_doc
"_id": "1", #文档的唯一标识
"_version": 2, #数据版本
"_seq_no": 1,
"_primary_term": 1,
"found": true, #是否查询到
_score: #查询的相关度
# 返回需要的数据列
GET /index_test3/_doc/1?_source=name,id
# 查询某个具体值是否存在
HEAD /index_test3/_doc/1
httpcode:200 存在 404不存在
乐观锁
按照乐观锁的操作,我们应该先拿到版本,写入时再比对一下
GET /index_test3/_doc/1?version=2
# 通过version来进行处理
6. ES中的分词类型,添加中文分词器
POST /_analyze
{
"analyzer": "standard",
"text": "Icoding is Very Well 1234 5678"
}
分词器类型
-
standard:默认分词器,大写转小写,按照空格拆分
-
simple:按照非字母分词,大写转小写
-
whitespace:按照空格拆分,不进行大小写转换
-
stop:按照空格分词,去除无意义单词:a an is
-
keyword:不分词
中文分词器:IK分词器
# 下载完解压到elasticsearch的plugin/ik目录下
unzip elasticsearch-analysis-ik-7.5.2.zip -d /usr/local/elasticsearch/elasticsearch-7.5.2/plugins/ik
-
ik_max_word:最细粒度的分词,会在词上再次拆分
-
ik_smart:只拆分一次
# 自定义词库
cd /{es-root}/plugins/ik/config
vi IKAnalyzer.cfg.xml
# 修改 <entry key="ext_dict">customer.dic</entry>
# 在同目录下创建customer.dic
# 可以添加自定义词语了
# 加完重启ES
因为该插件可以对数据进行,增删改查。故生产环境尽量不要使用,如果要使用,最少要限制IP地址。尽量不要使用。
感觉是 index => mappings表结构 => (doc行 => field列)
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论