十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统
原文链接: https://mp.weixin.qq.com/s/C9fWBqiE6TzDXfiZmg8l9Q
1. 什么是elasticsearch
Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。
大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁琐,总是让开发者敬而远之。而 Elasticsearch将 Lucene 作为其核心来实现所有索引和搜索的功能,通过简单的 RESTful 语法来隐藏掉 Lucene 的复杂性,从而让全文搜索变得简单
ES在Lucene基础上,提供了一些分布式的实现:集群,分片,复制等。
2. 搜索为什么不用MySQL而用es
我们本文案例是一个迷你商品搜索系统,为什么不考虑使用MySQL来实现搜索功能呢?原因如下:
MySQL默认使用innodb引擎,底层采用b+树的方式来实现,而Es底层使用倒排索引的方式实现,使用倒排索引支持各种维度的分词,可以掌控不同粒度的搜索需求。(MYSQL8版本也支持了全文检索,使用倒排索引实现,有兴趣可以去看看两者的差别)
如果使用MySQL的
%key%的模糊匹配来与es的搜索进行比较,在8万数据量时他们的耗时已经达到40:1左右,毫无疑问在速度方面es完胜。
倒排索引:
“关键词1”:“文档1”的ID,“文档2”的ID,…………。
“关键词2”:带有此关键词的文档ID列表。
3. es在大厂中的应用情况
es运用最广泛的是elk组合来对日志进行搜索分析。
58安全部门、京东订单中心几乎全采用es来完成相关信息的存储与检索。
es在tob的项目中也用于各种检索与分析。
在c端产品中,企业通常自己基于Lucene封装自己的搜索系统,为了适配公司营销战略、推荐系统等会有更多定制化的搜索需求。
4. es客户端选型
4.1 spring-boot-starter-data-elasticsearch
我相信你看到的网上各类公开课视频或者小项目均推荐使用这款springboot整合过的es客户端,但是我们要say no!

此图是引入的最新版本的依赖,我们可以看到它所使用的es-high-client也为6.8.7,而es7.x版本都已经更新很久了,这里许多新特性都无法使用,所以版本滞后是他最大的问题。而且它的底层也是highclient,我们操作highclient可以更灵活。我呆过的两个公司均未采用此客户端。
4.2 elasticsearch-rest-high-level-client
这是官方推荐的客户端,支持最新的es,其实使用起来也很便利,因为是官方推荐所以在特性的操作上肯定优于前者。而且该客户端与TransportClient不同,不存在并发瓶颈的问题,官方首推,必为精品!
5. 搭建自己的迷你搜索系统
引入es相关依赖,除此之外需引入springboot-web依赖、jackson依赖以及lombok依赖等。
es配置文件es-config.properties:
封装RestHighLevelClient
封装es常用操作:
创建索引,这里的settings是设置索引是否设置复制节点、设置分片个数,mappings就和数据库中的表结构一样,用来指定各个字段的类型,同时也可以设置字段是否分词(我们这里使用ik中文分词器)、采用什么分词方式。
分词技巧:
索引时最小分词,搜索时最大分词,例如"Java知音"索引时分词包含Java、知音、音、知等,最小粒度分词可以让我们匹配更多的检索需求,但是我们搜索时应该设置最大分词,用“Java”和“知音”去匹配索引库,得到的结果更贴近我们的目的,
对分词字段同时也设置keyword,便于后续排查错误时可以精确匹配搜索,快速定位。
我们向es导入十万条淘宝双11活动数据作为我们的样本数据,数据结构如下所示:
调用上面封装的批量导入方法进行导入:
我们调用封装的搜索方法进行搜索,搜索产地为武汉、价格在11-149之间的相关酒产品,这与我们淘宝中设置筛选条件搜索商品操作一致。
我们得到以下搜索结果,其中_score为某一项的得分,商品就是按照它来排序。
6. 扩展性思考
商品搜索权重扩展,我们可以利用多种收费方式智能为不同店家提供增加权重,增加曝光度适应自身的营销策略。同时我们经常发现淘宝搜索前列的商品许多为我们之前查看过的商品,这是通过记录用户行为,跑模型等方式智能为这些商品增加权重。
分词扩展,也许因为某些商品的特殊性,我们可以自定义扩展分词字典,更精准、人性化的搜索。
高亮功能,es提供highlight高亮功能,我们在淘宝上看到的商品展示中对搜索关键字高亮,就是通过这种方式来实现。
7. 项目地址
https://github.com/Motianshi/alldemo/tree/master/demo-search
最后更新于
这有帮助吗?