一篇文章带你学习Elasticsearch

在项目开发过程中,要使用到搜索 引擎来对一些关键字实现逆向查询,如果仅用模糊搜索,那么搜索的时间会根据数据量的增大而增大,对比之下就学了elasticsearch,也记录一下,常常回顾。

1. ElastchSearch核心术语学习

1.1. 术语学习
  • 索引index
    • 我们可以和数据库去类比,整个的ES就相当于一个数据库服务
    • 我们数据库中的表就是ES中的index
  • 类型type
    • 相当于一个逻辑类型
    • 比如商品的分类:食品、服饰、电子产品
    • ESv7.x以后就不再使用type了,5.x/6.x还有
  • 文档document(doc)
    • 相当于一个数据库表里的一行一行的数据
    • 就是索引中一条一条的数据
  • 字段field
    • 数据行的某一列
  • 映射的mappings
    • 相当于表结构的类型定义
  • NRT
    • Near Real Time
    • ES中新的文档被加入后可查询的时间间隔非常微弱,接近实时
  • shard
    • 数据分片的概念,需要进行水平扩展服务节点只需要加入新的机器到集群中即可
    • 集群的每个数据节点都是HA的
      • 主分片:承担数据写入的访问的作用
      • replica备份分片:除了做备份以外,还承担了读数据的水平负载作用
  • replica:备份分片
1.2. type为什么会去掉
  1. 为什么会有type?
    index库–>type表–>doc记录​
    如果要对记录进行分组,只需要给doc加一个分组的记录field即可,然后使用ES的分组桶来统计
  2. 因此在7.x完全去掉type的概念了

2. 什么是倒排索引

场景概念

我们不使用搜索引擎可不可以?

Redis在查询的时候:key-value?是通过key来找到的value,是否可以通过value来找key?通过value找到和这个value相似度极高的内容?

倒排索引(Inverted Index):比如通过歌词来查歌名,通过内容检索名称,而这个名称在系统中其实就是一个索引,通过歌来找歌词这是正排索引

比如拿课程学习举例:

文档编号 文档内容

1 架构师之路

2 Java成长之路(分词: Java 成长 之路)

3 ES成长学习入门

搜索的分词 这个分词在哪个文档中出现 文档编号:次数:位置

成长 2,3 2:1:<3>,3:1:<2>

3. 搜索引擎对比选型分析

1.1. 分布式存储与搜索

分布式就是通过多个节点构成的服务,可以横向扩张,所扩展的节点可以进行请求的分摊,以及存储的扩展

1.2. Lucene VS solr VS elasticsearch

Lucene是一个基于Java开发的全文搜索引擎,不是一个应用程序而是一个类库,有很多的API可以调用来实现我们的业务需要,本质上就是一个jar包,本身就不具备分布式、集群、HA等服务特性,如果你要自己通过Luncen实现分布式就比较复杂

Solr是基于Lucene开发的一个搜索引擎应用,是Apache开源项目,也是Java开发,需要独立部署在tomcat上,可以实现集群和分片,自身不支持集群结构,需要zookeeper来进行集群的支持提供服务注册,进行分布式索引查询,也是可以自己实现故障转移的(3组节点,每组2个solr,互为主从)

最大的问题是建立索引的过程中,索引效率下降的及其严重,实时搜索效率不高

搭建两套solr集群,用集群互相主备,升级A的时候,使用B,A升级完了切换到A再升级B
如果不考虑索引创建的同时,索引更新频率不高的情况下,solr的查询速度是略高于ES

支持添加多种数据格式到引擎中的

Elasticsearch也是基于lucene的分布式搜索引擎,对外提供了很多restful风格的接口,数据交互使用json格式

可以支持PB级别的搜索,提供进实时的查询,ELK(Elasticsearch、Logstash、Kibana)早期常用于进行日志分析系统的搭建

搜索引擎的选型

Lucene肯定是要使用到的,但都让solr或者ES给封装了,所以我不直接使用Lucene
solr和es,肯定选择elasticsearch

4.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集群之间及内部服务通信的端口

5. 界面插件ElasticSearch-Head/Kibana使用

5.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: "*"
5.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 &

6. 索引创建的基本操作

在这里插入图片描述
创建了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

7. 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
 }
 }
}

8. 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来进行处理

9. ES中的分词类型,添加中文分词器

POST /_analyze
{
 "analyzer": "standard",
 "text": "Icoding is Very Well 1234 5678"
}

分词器类型

  • standard:默认分词器,大写转小写,按照空格拆分
  • simple:按照非字母分词,大写转小写
  • whitespace:按照空格拆分,不进行大小写转换
  • stop:按照空格分词,去除无意义单词:a an is
  • keyword:不分词
  • 中文分词器:IK分词器

Github:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.2/elasticsearch-analysis-ik-7.5.2.zip

# 下载完解压到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列)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值