ElasticSearch 的概念解析与使用方式

ElasticSearch(后续简称 ES)在企业中的使用可以说是非常广泛了,那么 ES 到底是什么呢?我们学习 ES 能做到哪些事情呢?接下来我将用几篇文章详细聊一聊 ES 。
ES 是一款高性能的分布式搜索引擎,当然里面出现的高性能、分布式已经是见怪不怪了,因此我们的重点是在搜索引擎上面 。提到搜索引擎肯定不陌生,像百度、谷歌,它们都提供了自己的搜索引擎,我们每天都会在上面查找各种各样的信息 。
因此:通过输入指定的关键字(关键词)来获取与之相关的信息 , 这个过程称之为搜索 。并且搜索是不分场合的,除了百度、谷歌提供的搜索引擎之外,我们还可以在各种 App 上搜索,比如你在京东 app 上输入小提琴,那么点击确认之后会给你返回与小提琴有关的商品信息 , 这也是搜索 。
而支持搜索的工具便是搜索引擎,它负责根据用户输入的关键字匹配出与之相关的信息 , 然后返回给用户,所以搜索引擎就是支持用户搜索的一个工具 。
那么都有哪些工具支持搜索呢 , 其实说白了只要是支持字符串匹配的都可以,但能否满足不同的业务场景、以及保证高级别的搜索效率就两说了 。
 
使用数据库做搜索 
 
显然数据库是支持搜索的,毕竟它是专门用来存储数据的,其中也包含了数据分析 。比如数据库中有一张表负责存储商品信息 , 我要查询里面所有名字包含 "洗发水" 的商品对应的 id,那么就可以这么做:
SELECT product_id FROM product WHERE product_name LIKE '%洗发水%';很明显这么做是正确的 , 但是要拿数据库来做搜索引擎则是不合适的 。因为由于业务场景的不同,会带来两个问题:

  • 假设一个商品的名称不是 "...洗发水...",而是 "...洗发液...",这个时候该商品就选不到了 , 但它也是需要被选出来的;再比如用户想搜索 "榨汁机",但是不小心输成了 "榨汁鸡",这个时候也没办法搜索 。所以这种情况下,无法通过对关键词进行切分,来获取更多的结果 。
  • 如果我们不是按商品名称、而是按商品描述进行搜索 , 那么还会产生效率上的问题 。因为某些字段的内容会非常长,数千甚至上万个字符也是很常见的,这个时候要查询内部是否包含关键词所需要扫描的文本量就会非常大,并且该字段的每一行记录都需要扫描 。如果一张表里面有千万条记录,那么这个耗时会非常恐怖 。
因此用数据库实现搜索是不靠谱的,性能会非常差 。
 
ElasticSearch 的概念解析与使用方式

文章插图
全文检索和 Lucene 
 
既然数据库不适合专门用于搜索,那什么工具适合呢?当然是我们要聊的 ES 。只不过在具体介绍 ES 之前 , 我们需要先说一下什么是全文检索,以及 Lucene 。
首先全文检索(或者说全文搜索)也是一种搜索,只不过它和数据库中使用 like 不同,全文检索使用了倒排索引的技术,它分为两步:
  • 索引创建:从数据中提取信息 , 建立倒排索引
  • 搜索索引:根据用户的查询去搜索索引,然后返回索引对应的结果
直接说的话不容易理解,我们举例说明,假设数据库中有一张表 game 。
ElasticSearch 的概念解析与使用方式

文章插图
图片
假设要搜寻 type 字段包含 "校园" 或者 "爱情" 的记录,这个时候显然需要全表扫描 。如果库里面有上千万条记录,那么就需要扫描上千万次,且每次扫描的范围都是全部的字符 。此外这里指定了多个关键词 , 每个关键词都要模糊匹配一遍 。
SELECT id, name FROM gameWHERE type LIKE '%校园%' OR type LIKE '%爱情%';很明显这种 SQL 在 type 字段比较大的时候 , 其性能会非常差 。
因此我们需要建立倒排索引,由于这里要基于 type 字段做查询 , 那么就对 type 字段的每一个文本进行拆分 , 得到多个关键词,然后再建立关键词到 id 的映射 。
ElasticSearch 的概念解析与使用方式

文章插图
图片
通过对文本进行拆分,我们看到 type 字段包含 "亲情" 的有 id 为 1、2、3 的记录,包含 "夏日" 的有 id 为 2、3 的记录,所以每一个关键词都和包含该关键词的记录的 id 做了一个映射 。


推荐阅读