基于Elasticsearch的搜索优化
高吞吐量查询优化
因业务扩展,es 内数据不断增多,查询压力也不断增大,直至已经严重影响用户体验,故需进行彻底整改。
在整改过程中,经过不断尝试,关于 ES 查询方面总结为以下几点:
升级ES
随着用户量的增加,必不可少的采取了加机器、换SSD等措施,同时升级es,ES6.0性能较之前会有大幅提升。
自定义分词器
因业务原因,例如“美的”这类特殊词汇的监测等等,改造了分词器,变成了单字分词。
但单字分词,有利有弊,随着业务增加,弊端不断暴露,如一个 “的” 字对应的文档数量几乎等同于所有的文档数量,导致查询速度急速下降。
采用bigrams
?n-grams 方式,将含有m个字符的一句话拆分成m-1个n字符词汇,依次查询并组合结果集,这种查询会使查询效率在一定程度上有所提高,毕竟减少了每个词所需检索的文档数。
这种方式的弊端:不能适应单字查询与距离查询,须通过业务逻辑来满足业务需求。
巧用filter过滤
es 的过滤器有缓存的功能,且会优先进行过滤器里面的查询条件,综合自己的业务场景,提炼出一些能够大大减少文档数且相对固定的过滤词,能够大大提升查询效率,相对固定是为了能够复用缓存数据。如有必要,可推动改进业务需求来满足这一点。
查询语句优化
对于多个词的搜索,在使用多个单词query_string、should连接,单个多词query_string,match_phrase的方式都可以的情况下,这几种方式性能优劣是怎样的呢?
下面是具体场景的测试用例:
query_string?(0) (多个主体词空格分隔) |
query_string?(1) (单个主体词) |
?match?(2) (单个主体词)?? |
|||||||||||
非bigram方式(0) | bigram方式?(1) | 非bigram方式(0)? | bigram方式??(1) | 非bigram方式(0) | bigram方式?(1) | ||||||||
用例编号 | 是否过滤 | 命中量 | 用时ms | 命中量 | 用时ms | 命中量 | 用时ms | 命中量 | 用时ms | ?命中量 | 用时ms | ?命中量 | 用时ms? |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 不加过滤(0) | 11977 | 4046 | 11977 | 4046 | 11977 | 4046 | 11977 | 4046 | 11977 | 4046 | 11977 | 4046 |
主体过滤(1) | 11161 | 4063 | 2624 | 2559 | 3520 | 5300 | 2475 | 2233 | 2472 | 2886 | 2472 | 3352 | |
关键词过滤(3) | 11997 | 6299 | 11997 | 5179 | 11997 | 5010 | 11997 | 4081 | 11997 | 4094 | 11997 | 3700 | |
2 | 不加过滤 | 732 | 11532 | 732 | 11532 | 732 | 11532 | 732 | 11532 | 732 | 11532 | 732 | 11532 |
主体过滤 | 730 | 11855 | 726 | 3570 | 729 | 13105 | 726 | 3525 | 726 | 6557 | 726 | 9565 | |
关键词过滤 | 733 | 37096 | 733 | 15603 | 733 | 15919 | 733 | 8616 | 733 | 18386 | 733 | 8773 | |
3 | 不加过滤 | 24697 | 546 | 24697 | 546 | 24697 | 546 | 24697 | 546 | 24697 | 546 | 24697 | 546 |
主体过滤 | 24697 | 109 | 24695 | 118 | 24697 | 383 | 24695 | 72 | 24695 | 220 | 24695 | 180 | |
关键词过滤 | 24695 | 309 | 24695 | 96 | 24695 | 120 | 24695 | 82 | 24695 | 82 | 24695 | 90 | |
4 | 不加过滤 | 455 | 28437 | 455 | 28437 | 455 | 28437 | 455 | 28437 | 455 | 28437 | 455 | 28437 |
主体过滤 | 453 | 29294 | 451 | 8166 | 452 | 29958 | 451 | 8237 | 451 | 11586 | 451 | 14432 | |
关键词过滤 | 456 | 59674 | 456 | 33758 | 456 | 33569 | 456 | 20128 | 456 | 30771 | 456 | 20193 | |
5 | 不加过滤 | 1540 | 3412 | 1540 | 3412 | 1540 | 3412 | 1540 | 3412 | 1540 | 3412 | 1540 | 3412 |
主体过滤 | 1540 | 3487 | 1542 | 2764 | 1540 | 4962 | 1542 | 2613 | 1542 | 3341 | 1542 | 3515 | |
关键词过滤 | 1542 | 7650 | 1542 | 3971 | 1542 | 6345 | 1542 | 3428 | 1542 | 3600 | 1542 | 3409 | |
6 | 不加过滤 | 9724 | 22541 | 9724 | 22541 | 9724 | 22541 | 9724 | 22541 | 9724 | 22541 | 9724 | 22541 |
主体过滤 | 9724 | 22809 | 9742 | 22356 | 9724 | 26506 | 9742 | 22276 | 9742 | 23226 | 9742 | 25104 | |
关键词过滤 | 9742 | 31445 | 9742 | 26589 | 9742 | 26867 | 9742 | 26092 | 9742 | 23635 | 9742 | 24348 |
? | ? | ? | ? | ? | |
---|---|---|---|---|---|
用例编号 | 用例名称 | 主体词 | 关键词 | 全文排除词 | ? |
1 | 家乐福 | 家乐福 | <家乐福 食品安全~15|<家乐福 企业社会责任~15|<家乐福 O2O~15|<家乐福 电商~15|<家乐福 行业态势~15|<家乐福 生鲜~15|<家乐福 可持续发展~15|<家乐福 新零售~15|<沃尔玛 食品安全~10|<沃尔玛 企业社会责任~10|<沃尔玛 O2O~10|<沃尔玛 电商~10|<沃尔玛 行业态势~10|<沃尔玛 生鲜~10|<沃尔玛 可持续发展~10|<沃尔玛 新零售~10|<永辉超市 食品安全~15|<永辉超市 企业社会责任~15|<永辉超市 O2O~15|<永辉超市 电商~15|<永辉超市 行业态势~15|<永辉超市 生鲜~15|<永辉超市 可持续发展~15|<永辉超市 新零售~15|盒马生鲜|<盒马生鲜 新零售~15 | ? | ? |
2 | 东升产品信息 | 东升,博展 | 东升大厦|智造大街绿能基地|绿色能源产业基地|东升凯莱酒店|林萃路商务酒店|清河商务酒店|清河桥商务酒店|学清路商务酒店|La Vie商业广场|66号成长屋|东升加速器|东升孵化器|东升杯创业大赛|东升博展物业|博展投资|东升知春物业|东升博展酒店|悦华庭酒店|东升博展科技|东升科技企业加速器|东昇合创科技孵化器|三符整合营销机构|((东升科技园|东升集团|东升博展)&(一卡通|ville商业街|梦想家园|伊布里克咖啡|果士芙|钰花溪|北领地|赛百味|没名儿生煎|咖啡陪你|吃茶去|张亮麻辣烫|7-11|奥力健身房|汉堡王|吉野家|明洞邦|面爱面|海南鸡饭|居酒屋|乐刻健身|星巴克咖啡|鲍师傅|DQ))|(东升科技园|东升博展|博展集团)&(投融资|小额贷|直投|基金|信用评估)|((王小东|陈斌|李宝林|徐振辉|卢金玲|颜海军|刘亚洁|续卫国|刘新强|符志刚|卢维维|代庆|党玉林|郭小庆|余熊杰|张奕)&(博展|东升博展)) | ? | ? |
3 | 礼品 | 礼品 | 礼品 | ? | ? |
4 | 东升产品信息+排除 | 东升,博展 | 东升大厦|智造大街绿能基地|绿色能源产业基地|东升凯莱酒店|林萃路商务酒店|清河商务酒店|清河桥商务酒店|学清路商务酒店|La Vie商业广场|66号成长屋|东升加速器|东升孵化器|东升杯创业大赛|东升博展物业|博展投资|东升知春物业|东升博展酒店|悦华庭酒店|东升博展科技|东升科技企业加速器|东昇合创科技孵化器|三符整合营销机构|((东升科技园|东升集团|东升博展)&(一卡通|ville商业街|梦想家园|伊布里克咖啡|果士芙|钰花溪|北领地|赛百味|没名儿生煎|咖啡陪你|吃茶去|张亮麻辣烫|7-11|奥力健身房|汉堡王|吉野家|明洞邦|面爱面|海南鸡饭|居酒屋|乐刻健身|星巴克咖啡|鲍师傅|DQ))|(东升科技园|东升博展|博展集团)&(投融资|小额贷|直投|基金|信用评估)|((王小东|陈斌|李宝林|徐振辉|卢金玲|颜海军|刘亚洁|续卫国|刘新强|符志刚|卢维维|代庆|党玉林|郭小庆|余熊杰|张奕)&(博展|东升博展)) | 大城县东升大厦西侧,清代,第一代,招聘,出租,招租,www.454726.net,求租,请选择网点,吃过8家以上才算真吃货,以下是海口在,1室1厅,附近有苏果超市和欧尚超市有环宇城,呷哺呷哺,长兴欧洲花园,两间门面,霍兰公寓,中梁集团,2房2厅,到珍珠园饭店怎么走,嘉兴万家汇,请选择网点,上海收人头马路易十三洋酒礼盒路易十三洋酒回收价格上门回收,公交沧海路百丈东路口站往北移200米,金隅国际到欧尚超市来广营店怎么走,汇金国际广场-欢迎您实地考察,公交站点集合出发,二手房,房屋类型,周边配套设施,小区建筑面积,无中介费,拎包入住,区周边配套,租房合同,蜀汉路欧尚超市后面,房屋精装修,骑行溧水石湫农家乐,房屋户型,学府具体位置,四室二厅,一室一厅,二室一厅,二室二厅,三室一厅,三室二厅,怎么坐公交车,张国银老师卓越团队管理专家曾任,1室1厅,2室1厅,3室1厅,2室2厅,3室2厅,4室2厅,吴江-国贸商业中心,吴江国贸中心,吴江国贸商业中心,国贸商业中心销售热线,不收中介费,杨公井捷安特活动,小区规划,小区配套,租金可谈,两室一厅,两室两厅,两室二厅,租房子,转租,无中介,押一付三,押一付一,押二付二,押一付二,押二付一,月付,自家宝宝穿的,楼盘,年产权,看房时间,看房人数,合租,20号、21号海阳连理岛赏胶东半岛最美油菜花,售楼处,欧尚超市门口乘,天行健健身,看房热线,现房,房屋信息,一室两厅,一室二厅,48路、209路、847路75路、36路,欧尚超市正对面,欧尚超市斜对面,公益徒步大会活动,家养小猫还剩,原本夜逛嘉兴月河计划泡汤,镇江酷跃蹦床主题公园VIP体验卡,中吴大道兰陵路三院欧尚超市东,改善型品质住宅,生态居住环境,三室两厅,四室两厅,二室两厅 | ? |
5 | 高鑫零售 | 高鑫,大润发 | <(高鑫零售|高鑫超市) (食品安全|企业社会责任|"OTO"|电商|行业态势|生鲜|可持续发展)~20|<大润发 食品安全~20|<大润发 企业社会责任~20|<大润发 "OTO"~20|<大润发 电商~20|<大润发 行业态势~20|<大润发 生鲜~20|<大润发 可持续发展~20 | ? | ? |
6 | 北京医改 | 北京,医改 | <北京 医事服务费|医药分开|挂号费|公立医院改革|公立医院的综合改革|医院综合改革|医疗服务价格|阳光采购|医药分开|医药集中采购|医药集中招标|药品集中采购|药品集中招标|药物采购|医疗改革|医改新政|分机诊疗|医药分开综合改革|医改新政|以药补医|以药养医|零差率销售|医改|医院综合改革|医药卫生*|药品加成|医疗服务价格|药品零差率|社会办医~30 | ? | ? |
结论:
针对测试结果,单词query_string方式 + bigrams + 主体过滤效果最好
(注:此处的bigrams只针对过滤词,不针对话题语法)
延伸测试:
最优方式 + 话题关键词bigram:
在此基础上,对于非距离话题的话题语法部分? 使用bigrams方式? 进行进一步测试,结果如下:
话题2? ? 命中量:726? ? ? ? ? 用时:717? ? ? ? ? ? ? ? ? (原测试最优结果? ??命中量:726? ? ? ??用时:3525 )
话题3? ? 命中量:24695? ? ? 用时:74? ? ? ? ? ? ? ? ? ? (原测试最优结果? ??命中量:24695? ??用时:72 )
话题4? ? 命中量:451? ? ? ? ? 用时:1951? ? ? ? ? ? ? ? (原测试最优结果? ??命中量:451? ? ? ? 用时:8237)
效果较好
按时间建立索引
对于这些业务场景的查询,一般都会有时间的范围限制,可以针对具体的业务场景做一些变更,例如本案例中的业务场景多数会查看使用近一天、近三天的数据,一个是可以采用es新版本提供的关于近几天时间的过滤查询,另一种就是在es集群创建索引的规则上做一些处理。
关于时间索引,可以按天创建索引,也可以按月创建索引,根据业务需要做不同选择,那么问题来了,随着时间的推移,索引数量会越来越多,对es的性能也会有影响。这时候我们会发现,对于历史悠久的数据不会经常被使用,这部分数据称之为冷数据,这些数据就可以集中放在一个索引中,有使用需求时直接去这个里面查询即可,随之而来的工作量就是数据迁移以及数据清理工作,对于根本不会使用的数据要及时清理。
以上就是对于查询部分的优化探索之路,仅查询部分速率提升了20%。
不过此次整改不仅针对es查询做了优化,还使用了业务缓存,整体性能提升显著,百万级别的数据搜索达到秒级别,虽解决了问题,但是es的优化还在不断进行中。