关于全文检索的诞生!

在互联网的告诉发展下、最开始诞生的关系型数据库已经满足不了、复杂的业务场景。

比如说搜索淘宝的商品信息等等、在传统的关系型数据库Mysql、除了Mysql设置全文检索索引、那么正常会一条条的扫描,扫描字段里面的数据。

1、比如说“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,懒判断说,你包不包含我指定的这个关键词(比如说“牙膏”)。

2、还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入“生化机”,就搜索不出来“生化危机”。

3、这些数据库都是国外的产品是针对英语、对中文并不友好、不像应该以个单词一个空格那样。

什么是全文索引

简单的说是在存入过程中把数据拆成词放到一个索引里面、叫倒排索引。

什么是全文检索.png

Elasticsearch是基于Java开源项目Lucene

Lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。Elasticsearch基于lucene的开源项目、制作的,在Lucene的基础上做了分布式。解决单台服务器一个Lucene的弊端等。

如果说、数据量很大的话,超过了单台机器的承受范围,就必须得用多台机器去进行数据的存储和搜索。如果我们自己来实现,非常麻烦。

Elasticsearh对比lucene增加功能

  • 自动维护数据的分布到多个节点的索引的建立,还有搜索请求分布到多个节点的执行。
  • 自动维护数据的沉余副本,保证一些机器宕机了、也不会丢失任何数据。
  • 封装了更多的高级功能、增加复杂的搜索功能。聚合分析功能、高级功能等。

Elasticsearch是对比coreseek全文检索来说、Elasticsearch是实时处理的。

Elasticsearch的特点

  1. 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
  2. Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ESlucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat
  3. 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
  4. Elasticsearch数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作)、特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理。Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能

elasticsearch的核心概念

Near Realtime(NRT)

近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

Cluster

集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常

Node

节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

Document&field

文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

product document
{
"product_id": "1",
"product_name": "高露洁牙膏",
"product_desc": "高效美白",
"category_id": "2",
"category_name": "日化用品"
}

Index

索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

Type

类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

商品index,里面存放了所有的商品数据,商品document

但是商品分很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field

type,日化商品type,电器商品type,生鲜商品type

日化商品type:product_id,product_name,product_desc,category_id,category_name
电器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
生鲜商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

每一个type里面,都会包含一堆document

{
"product_id": "2",
"product_name": "长虹电视机",
"product_desc": "4k高清",
"category_id": "3",
"category_name": "电器",
"service_period": "1年"
}


{
"product_id": "3",
"product_name": "基围虾",
"product_desc": "纯天然,冰岛产",
"category_id": "4",
"category_name": "生鲜",
"eat_period": "7天"
}

shard

单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

replica

任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

图

elasticsearch核心概念 vs. 数据库核心概念

Elasticsearch 数据库

—————————————–

Document 行
Type 表
Index 库

Last modification:January 29, 2020
如果觉得我的文章对你有用,请随意赞赏