站内搜索优化(为什么要用ElasticSearch)

问题

在开发找房微服务时,有一个搜索框,用户可以通过搜索框,用户通过输入某个关键字或者一句话搜索,检索到相关数据的房源。

所以我们检索数据库前应该要做的事:要对输入的关键字或者句子进行分词,找出里边的关键词。

但是我们单纯用数据库检索还是存在很多问题。

下面以我做项目时碰到的一个问题为例:

我们通过输入的关键词,查询数据库表对应的数据,此时我们的数据将由两张表联合查询完成。
下面放查询sql
在这里插入图片描述
我们运行sql语句并查看执行计划
在这里插入图片描述

执行计划快速了解

出现了using where说明使用了where条件过滤,需要回表查询数据。

Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。(意思就是先找到符合description字段中包含房屋的数据,然后再找符合id = house_id的列)

using index表示不需要回表直接能取到数据(多出现再你查的字段都为索引的情况)

什么是回表?
当查询的一个字段数据为非索引列字段时,需要通过回表查询。
例子:id name sex
其中id为主键(聚集索引),name为普通索引。
mysql聚集索引树结构,红框表示主键值,主键值下边的叶子节点存储行记录。
在这里插入图片描述
mysql普通索引树结构,通过将索引列建立一个类似于书籍目录一样的结构。叶子节点存储的树主键值。
在这里插入图片描述
通过聚集索引的查询类似于我们翻书,直接知道第几页然后我们直接翻到那一页。
通过普通索引的查询似我们不知道是那一页,我们先查阅目录,然后找到那一页。

再来解释using index,我们通过查阅普通索引的树里边就存储了我们需要的数据(比如ls就是我们需要的数据)
回表就是,我们通过查询普通索引后,发现里边并没有存储我们想要的数据,这时候我们通过叶子节点存储的id,也是就表的主键。我们再通过聚集索引树,找到叶子节点里我们需要的其它数据。

我们的sql语句出现了Using index condition,这个执行计划表示,所需要的数据需要通过回表才能查询到。那么我们怎么避免这个问题呢?
很显然,如果我们如果只通过mysql语句优化是不可能解决问题的,光是like条件就会让我们进行全表扫描,找到匹配的数据。那么如果我们一开始如果就能知道所需要的查询列的主键id,那么这将会极大改善sql运行速度。
在这里插入图片描述
像上图这样就能避免Using index condition。

这时候就是为什么我们需要使用ElasticSearch站内搜索引擎的原因。

ElasticSearch是什么(简单介绍)?

ES是一个基于lucene构建的开源、分布式、restful接口的全文搜索引擎。ES还是一个分布式文档数据库,其中每个字段均是被索引的数据可被搜索。能在短时间内存储和搜索分析大量数据。

ES的优点:
1.横向扩展性:只需要做简单的配置便可以增加一个ES集群点。
2.分片机制提供更好的分布性:同一个索引分成多个分片。
3.高可用:提供复制机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍然照常运行。并把宕机丢失的信息复制到其它节点上。
4.使用简单,开箱即用。

ES支持全文搜索,通过扫描每一个词,对每一个词建立索引,指明该词在文章中出现的次数和位置。

ES通过分词器,和全文搜索,并且为我们提供了分词搜索,和模糊匹配搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值