「Elasticsearch」1. 什么是 Elasticsearch

310 阅读3分钟

为什么不用MySQL做搜索

假如我们想买一个摄像头是索尼传感器的手机,那我们可能会搜索“索尼传感器”。我们在京东尝试搜索一下:

可以发现,第一个商品实际的描述是:

realme 真我GT 大师探索版 120Hz三星AMOLED曲面屏索尼IMX766传感器骁龙...

如果是数据库的话,SQL 可能是:

select * from product where description like '%索尼传感器手机%';

这样的话很明显是搜不到的,我们需要写一条这样的SQL

select * from product where description like '%索尼%' and description like '%传感器%' and description like '%手机%';

实际情况会比这条SQL更复杂,并且程序不知道怎么拆分“索尼传感器手机”。

所以,MySQL 不能很好的满足这种搜索,类似的搜索也叫全文检索。

什么是全文检索

引用百度

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文搜索搜索引擎数据库中的数据。

我们举个例子

idname
1国行苹果手机
2韩国三星手机
3国产华为手机
4罗永浩锤子手机
5国产一加手机

生成一个索引表如下

keywordids
国行1
苹果1
手机1,2,3,4,5
韩国2
三星2
国产3,5
华为3
罗永浩4
锤子4
一加5

这时候我们搜索“国产手机”,会把“国产手机”拆分为“国产”和“手机”,我们根据关键词搜索“国产”,得到id是3和5,搜索手机,得到id是1,2,3,4,5。如果要精确匹配,我们返回这两个的交集,是3和5。如果比较模糊的,就返回并集,是1,2,3,4,5,因为3,5出现次数比较多,我们把3,5放在最前面。

这就是全文检索。上面的那张索引表就是倒排索引

什么是ElasticSearch

简单说,es就是帮助我们更好的管理这些索引数据,并且能很好的支持分布式。

功能

  1. 分布式搜索引擎和数据分析引擎
  2. 全文检索,结构化检索,数据分析
  3. 对海量数据进行近实时的处理

场景

  1. 百度百科、维基百科
  2. 新闻网站
  3. 论坛
  4. Github
  5. 电商
  6. 日志分析
  7. 商品价格监控
  8. BI系统6
  9. ...

特点

  • 将全文检索、数据分析、分布式结合在一起
  • 开箱即用
  • 传统数据库的补充

ElasticSearch的核心概念

Near Realtime(NRT)

近实时。从写入数据到可以被搜索到有一个小延迟,大概1秒。基于es搜索和分析也是秒级。

Cluster

默认支持集群。集群有一个名字,默认是elasticsearch,也可以修改。

Node

集群中的一个节点。节点也有一个名字,默认是随机分配的。

Document

文档,es中的最小数据单元。可以理解为 MySQL 里的行。

通常是Json数据结构。一个document里有多个filed,每个filed就是一个数据字段。

Index

索引,可以理解为MySQL里的库。

Type

类型,每个索引里有多个Type,一个type下的document,都有相同的filed。

type主要是因为有一些相似的document,但filed不一样,就存在不同的type中。

shard

分片

随着业务增加,数据量变大,我只要加机器就行了。

replica

数据副本。其实就是一个备份库。为了保证系统高可用。

主库其实叫primary shard,从库叫replica shard,默认primary shard是5个,replica shard也是5个,原则上是主从在不同的机器,所以最好有两台服务器去部署。