开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情 在学习elasticsearch的详细使用方法前,我们先了解下es的一些基础概念。
1.问什么要选择Elasticsearch?
首先我们思考一个问题,市面上已经有了那么多的数据库了,比如MySQL、PostgreSQL 等等,为什么我们的业务总还需要有elasticsearch呢?这些数据库存储工具不都是为了存储数据做一些业务上的CURD操作吗?
其实一个很重要的原因就是MySQL之类的关系型数据库在一些快速插入、删除、修改的场景非常合适,比如在电商实际业务当中,我们要在MySQL数据库插入订单,在订单履约的整个流程中,要对订单表的订单的状态不断进行修改等等。
但是对Elasticsearch来说呢,频繁的修改数据不是一个很好的选择,通常我们的建议是“一次写入,不再修改”,这是为什么呢?这就要谈到Elasticsearch的底层工作原理了--倒排索引。
倒排索引,索引吗!那就是搜索,说明Elasticseach的底层针对搜索进行了优化,我们先来说下倒排索引的基本原理,然后再讲一下ES的修改删除数据的原理,就能了解为什么Elasticsearch适用于搜索的场景,不适用于频繁修改的场景了。
2.什么是倒排索引?
我们先说下关系型数据库数据的存储方式,以MySQL为例,我们有一张用户表,记录了一些用户的信息,我们根据业务的需要建立了一些索引,比如我们用id跟name建立了索引,我们在进行精确查询或者遵循最左原则进行一些数据查询的时候,在服务器承载范围内,效率是非常高的。
但是,如果我们利用MySQL进行一些模糊查询比如like ‘%xx%’,或者一些聚合之类的操作,在数据量很大时候效率是十分低的,甚至有时候执行一个SQL请求过程中会造成服务器卡死,影响正常业务的进行,对公司造成损失。
那么我们的业务经常有一些场景需要对某些数据进行相关性的查询,比如电商场景中,根据某个关键词查询所有带有这个关键词的商品,还有根据多个关键词进行查询等等,在MySQL中我们的查询sql可能如下:
select item_info1, item_info2, item_info3 from item_table where item_info_1 like “%A%”
union
select item_info1, item_info2, item_info3 from item_table where item_info_1 like “%B%”
倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
倒排索引可以被认定为一本词典,比如我们小时候人手一本的《新华字典》,当我们找到某个自的时候,下边会对应一些字的解释以及造的此剧等等,所以倒排索引就可以描述为字词到解释造句的描述,在es中描述为关键词到相关文档ID集合的映射。倒排索引 有两个重要的组成部分单词词典跟倒排文件。
这条sql肯定是不会走索引的,并且会如果在数据量很大的场景下,效率是十分低的。 那么如果我们想在某个字段根据关键词进行相关性的搜索时候,es会是最好的选择。es的底层实现原理是依赖倒排索引的
3.了解下elasticsearch索引的基础知识。
倒排索引了解完,我们来看一个订单的创建索引的模版。后边我们所有的操作都是基于这个模版。会在这个索引的基础之上进行相应的修改,一步一步由浅到深。
PUT /order
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"blockGuid": {
"type": "keyword"
},
"blockName": {
"type": "keyword"
}
}
}
}
简单的了解完这些基本概念后,我们就开始下一小节,进行我们的实战吧!
- settings:就是索引的一些配置项,里边包含的一些索引的配置信息。
- number_of_shards:是指索引要做多少个分片,只能在创建索引时指定,后期无法修改。
- number_of_replicas: 是指每个分片有多少个副本,后期可以动态修改。
- mappings:字面来说是映射,其实就是定义索引包含的一些详情信息。
- properties:里边包含的是一些字段详细映射关系。
- @timestamp:记录数据产生时的一条时间戳
- type:字段的数据类型。
首先来解释下这个创建索引json里边的一些字段所对应的信息是啥意思。