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目录下。