1. 介绍
ElasticSearch,简称ES,是java开发的一个开源的、高扩展的、分布式的全文搜索引擎服务器
所以说它是一个单独的软件,可以提供跟百度、谷歌一样的搜索功能
官网地址:免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
1. 为什么使用ES
传统的数据库查询,假如现在有一个商品表
需求1:从 title 获取包含“手机”的数据
select * from goods where title like '%手机%'
这个sql存在的问题:
- 使用like时,以‘%’开头,会导致索引失效,这时候全表扫描,效率低
而且,如果表中数据太多,比如:1亿条,假设1秒钟查询十万,也需要1000秒,速度慢
需求2:从 title 获取包含“华为手机”的数据
select * from goods where title like '%华为手机%',这个sql根本就查不出来
总结,使用数据库查询
- 效率低
- 功能弱
ES能解决这些的问题
2. 两种索引
假设有一本古诗集,包含
《静夜思》 窗前明月光,疑是地上霜。 举头望明月,低头思故乡。 《水调歌头》 明月几时有?把酒问青天。 不知天上宫阙,今夕是何年? ..... 《月下独酌四首》 花间一壶酒,独酌无相亲。 举杯邀明月,对影成三人。 .....
需求:找出这本书中包含“明月”的古诗
1. 正向索引
搜索逻辑:先看《静夜思》里有没有“明月”,有就记录,再看《水调歌头》里有没有“明月”,有就记录。。。。
就这样一首一首的判断下去,很明显效率很慢
2. 反向索引
又称:倒排索引,按照规则,对文本内容进行分词,拆分出不同的词条(term)
比如:床前明月光,就可能分成:床前、明月、光、月光等词条
所以它最终的索引结构:
这样就能根据“明月”快速的查询到对应古诗
总结:倒排索引,对文档内容进行分词,最终得出词条和文档唯一标示(文档id)的对应关系
3. ES的存储和搜索原理
ES中存在文档、索引库着两个概念
- 文档经过分词后存到索引库ES中的文档是json
- 索引库存储着词条跟文档的对应关系,并向用户提供搜索服务
倒排索引建立的过程:
- id=1 的数据第一个存进来,分词后
- 然后 id=2 的数据进来,分词后:三星、移动、4G、手机
- 三星、移动、4G是新增的词条,手机是已存在的词条
- 三星、移动、4G是新增的词条,手机是已存在的词条
就这样文档以倒排索引的方式存放到索引库
同时也会对词条进行处理,形成树形结构,有点儿类似数据库中跟某个字段建立索引,目的是提高查询速度
查询时,如果用户输入“华为手机”
- 先分词为:华为、手机
- 根据这两个词条分别查询
- 最后汇总结果,反馈用户
4. ES和Mysql区别
- mysql有事务,ES没有
- ES没有外键,如果数据一致性要求高,还是要用Mysql
总结:mysql存储数据,ES搜索数据