Elasticsearch入门笔记(一)
前言
在工作的中使用到部分ElasticSearch
沾边的东西,ELK
日志实时分析系统,对ElasticSearch
也略有耳闻,趁着最近有时间学习一下,并将学习过程中知识点记录下来。
介绍
ElasticSearch
是基于Luncene
的分布式高性能的全文搜索引擎,Luncene
是使用java
开发的一个全文搜索引擎工具包,而ElasticSearch
它将Luncene
的复杂性对用户屏蔽,提供简单易用的Restful Api
,开发者只需要使用该api
接口就可以使用全文搜索。
安装
我使用的是mac
电脑,使用的是docker desktop for mac
工具,通过Kitematic
工具直接搜索了elasticSearch
进行安装,我安装的镜像是blacktop/elasticsearch
版本是7.10.1
,它只挂载了data
目录,我本地通过容器管理工具将plugins
路径也挂载出来,方便添加分词器。
同时还需要使用到google
插件elasticsearch-head
便于查看数据等情况;同样使用了docker
安装了blacktop/kibana
镜像,kibana
内置了解析器,对es
的restful api
有对应的支持。
基本概念
1. 集群
es
本质上就是一个分布式系统,允许多台服务器协同工作,可以在一台服务上部署多个es
实例,每一个实例称为一个节点。本想模拟单机多节点的集群情况,花了很多时间发现各个节点之间就是无法访问到,不知道主要原因是不是由于macos
的容器机制,导致宿主机无法直接访问容器ip
导致。
2. 索引
es
的数据管理顶层单位称为索引Index
,它类似于关系数据库中的库的概念,也就是每一个Index
就是一个数据库,且规定名称必须为小写。
3.类型
索引Index
下就是类型Type
,类似于关系数据库中的表的概念,但是在6.x
版本之后,一个Index
值允许一个Type
,所以类似于一个库中只允许一张表。
4.文档
Type
下就是文档Document
,一个Type
包含多个Document
,document
类似于关系数据库中一行记录。
5.分片
es
的数据是存储在节点上,每个索引的数据量不一样,需要的计算和处理数据的能力不一样,所以在创建每一个索引是可以同时创建的分片数,将数据处理分散到不同的节点。同时还分为主分片和副本分片,副本分片是主分片的一个备份,若主分片所在的节点宕机,启用改节点主分片的副本分片,所以主分片和副本分片将落在不同的节点。
关系型数据库和es基本结构概念对比
关系型数据库 | es |
---|---|
库 | Index |
表 | Type |
行 | Document |
一行中的某一列 | Field(es是使用json表达数据) |
索引 | 全文索引(这个地方有可能出现理解的误差,二者在各自结构中的意思都是加快查询数据的速度) |
6.倒排索引
倒排索引是es
中比较核心的一个概念,是指从文档的词项映射文档ID
的一个过程。在关系型数据库中,一般采用的是正排索引,即从数据ID
查询某个数据的关系。
比如有以下数据:
id | name | age | address |
---|---|---|---|
1 | 张三 | 10 | 福建省福州市 |
2 | 李四 | 10 | 福建省莆田市 |
3 | 王五 | 30 | 福建省泉州市 |
4 | 赵六 | 30 | 湖南省长沙市 |
5 | 孙七 | 30 | 福建省南平市 |
6 | 钱八 | 60 | 浙江省杭州市 |
以上就是正排索引,当知道某个人的ID
就可以通过主键ID
去获取这个人的年龄和地址信息。
倒排索引结构:
age字段
词项Term | 文档列表 |
---|---|
10 | [1, 2] |
30 | [3, 4, 5] |
60 | 6 |
address字段,当然这里的词项不一定只有xx省
,也可以是xx市
,这里只是简单举个例子。
词项Term | 文档列表 |
---|---|
福建省 | [1, 2, 3, 5] |
湖南省 | 5 |
浙江省 | 6 |
按以上的结构存储倒排索引之后,若需要查询福建省的所有人,就可以直接根据福建省
的词项获取到1,2,3,5
四个文档是符合条件,然后在结合正排索引,将这符合这四个id
的文档找出。
当然了或许有人会说那不是直接select * from table where address like %福建省%
就可以找出数据吗?在关系型数据库中模糊查询是无法命中索引的,也就是说模糊索引是需要全表扫描的,对于es
的大数据定位而言是互斥的,所以增加倒排索引使得es
的检索效率和性能显著提高。
7.路由
一个索引可以指定多个分片,且在多机的集群环境中,分片可能散落在不同的服务器上,在操作时可以将相关性数据存储在同一个分片上,提高检索效率。
shard = hash(routing) % number_of_primary_shards
数据落在的分片编号 = 哈希函数(routing值)对分片数取余,默认routing值为文档id
分词器
分词器又叫分析器Analyzer
,分词器的作用就是将文本经过分析之后转化为词项,在es
搜索的最基本单元就是词项Term
,通过词项来建立文档之间的映射。在es
中又内置了多种基本的分词器,都是对英文的分词。
分词器 | 作用 |
---|---|
Standard Analyzer | 英文标准分词器 |
Whitespace Analyzer | 空格分词器 |
Pattern Analyzer | 正则分词器 |
KeyWord Analyzer | 关键词分词器 |
目前使用的比较多的中文分词器应该是elasticsearch-analysis-ik
,代码托管在github
上,可以直接下载之后添加到plugins
目录下。