欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

基于Elasticsearch的搜索优化

程序员文章站 2022-05-11 10:11:35
高吞吐量查询优化 因业务扩展,es 内数据不断增多,查询压力也不断增大,直至已经严重影响用户体验,故需进行彻底整改。 在整改过程中,经过不断尝试,关于 ES 查询方面总结为以下几点: 升...

高吞吐量查询优化

因业务扩展,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的优化还在不断进行中。