关于全文检索的诞生!
在互联网的告诉发展下、最开始诞生的关系型数据库已经满足不了、复杂的业务场景。
比如说搜索淘宝的商品信息等等、在传统的关系型数据库Mysql、除了Mysql设置全文检索索引、那么正常会一条条的扫描,扫描字段里面的数据。
1、比如说“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,懒判断说,你包不包含我指定的这个关键词(比如说“牙膏”)。
2、还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入“生化机”,就搜索不出来“生化危机”。
3、这些数据库都是国外的产品是针对英语、对中文并不友好、不像应该以个单词一个空格那样。
什么是全文索引
简单的说是在存入过程中把数据拆成词放到一个索引里面、叫倒排索引。
Elasticsearch是基于Java开源项目Lucene
Lucene
,就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。Elasticsearch
基于lucene
的开源项目、制作的,在Lucene
的基础上做了分布式。解决单台服务器一个Lucene
的弊端等。
如果说、数据量很大的话,超过了单台机器的承受范围,就必须得用多台机器去进行数据的存储和搜索。如果我们自己来实现,非常麻烦。
Elasticsearh对比lucene增加功能
- 自动维护数据的分布到多个节点的索引的建立,还有搜索请求分布到多个节点的执行。
- 自动维护数据的沉余副本,保证一些机器宕机了、也不会丢失任何数据。
- 封装了更多的高级功能、增加复杂的搜索功能。聚合分析功能、高级功能等。
Elasticsearch是对比coreseek全文检索来说、Elasticsearch是实时处理的。
Elasticsearch的特点
- 可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
Elasticsearch
不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES
;lucene
(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat
)- 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂
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 库