我刚打酱油去了,不好意思

Elastic日报 第791期 (2019-11-23)

1.使用es进行简单机器学习

http://t.cn/AidY4Wtv

2.es分布式结构简单讲解

http://t.cn/AidY4W5k

3.一款快速计算向量相似的插件

http://t.cn/AidYGufx

继续阅读 »

1.使用es进行简单机器学习

http://t.cn/AidY4Wtv

2.es分布式结构简单讲解

http://t.cn/AidY4W5k

3.一款快速计算向量相似的插件

http://t.cn/AidYGufx

收起阅读 »

Elastic日报 第790期 (2019-11-22)

1.Elastic中国开发者大会的精彩日程现已上线!
http://t.cn/AidNmls5
2.深入Elasticsearch身份验证
http://t.cn/AidN7mLg
3.深入理解Elasticsearch写入过程
http://t.cn/AidN7Tr0
4.Elasticsearch搜索Suggest功能优化
http://t.cn/E5BoAmR

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.Elastic中国开发者大会的精彩日程现已上线!
http://t.cn/AidNmls5
2.深入Elasticsearch身份验证
http://t.cn/AidN7mLg
3.深入理解Elasticsearch写入过程
http://t.cn/AidN7Tr0
4.Elasticsearch搜索Suggest功能优化
http://t.cn/E5BoAmR

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

Elastic日报 第794期 (2019-11-26)

1、基于ES的简单语义搜索
http://t.cn/AidSZrzZ
2、Python 和 Elasticsearch 构建简易搜索
http://t.cn/AidSZFNm
3、HanLP ES插件折腾小记
http://t.cn/AidSwZnp

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1、基于ES的简单语义搜索
http://t.cn/AidSZrzZ
2、Python 和 Elasticsearch 构建简易搜索
http://t.cn/AidSZFNm
3、HanLP ES插件折腾小记
http://t.cn/AidSwZnp

编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

Elastic日报 第789期 (2019-11-21)

1、通过rsyslog搭建集中日志服务器
http://t.cn/AidSZixZ
2、使用ELK实时分析SSH暴力破解
http://t.cn/AidSZlkc
3、使用ELK分析Windows事件日志
http://t.cn/AidSZmA0

编辑:江水
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
继续阅读 »
1、通过rsyslog搭建集中日志服务器
http://t.cn/AidSZixZ
2、使用ELK实时分析SSH暴力破解
http://t.cn/AidSZlkc
3、使用ELK分析Windows事件日志
http://t.cn/AidSZmA0

编辑:江水
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub 收起阅读 »

2019年Elasticsearch用户调查

本次用户调查针对的是全国的ES用户,由Elastic官方联合阿里共同发起。调查结果报告会在2019年Elastic开发者大会-北京上正式发布。
poster.JPG

 
本次用户调查针对的是全国的ES用户,由Elastic官方联合阿里共同发起。调查结果报告会在2019年Elastic开发者大会-北京上正式发布。
poster.JPG

 

2019Elastic中国开发者大会的精彩日程现已上线

请不要错过2019年12月7日在北京举行的Elastic 中国开发者大会 2019 (Elastic Dev Day China 2019),本次活动由 Elastic 官方再一次在中国举办的开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats等,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

大会亮点:
  • Elastic 官方在中国组织召开的开发者大会
  • Elastic Stack 7.x 最新功能更新介绍
  • Elastic 官方团队 AMA 展台(Ask Me Anything)
  • 三大主题分会场尽显技术架构、搜索开发和实践应用之美
  • 来自中国互联网头部公司和知名企业的最佳实践干货分享
  • 涵盖搜索数据中台、ELK的容器化和云原生等众多丰富议题
  • 深度剖析大规模搜索生产系统的体系架构、设计演进和平台优化技术



大会日程已经上线:请点击获取大会日程详情!https://www.bagevent.com/event/6072003
 

unnamed_(3).png

unnamed.png

unnamed_(2).png

unnamed_(1).png

 
这是本年度关于ELK、Elasticsearch和企业搜索的最佳盛会;精彩内容岂能错过?座位有限,现在就得动手!

早鸟票还有少量剩余,欢迎前往抢购!

限时提供标准票的9折优惠码,购票时点击“使用优惠或邀请码”,输入:zwsq 即可享受9者优惠!
 

中文社区.png

 
 
关于大会的更多详情请参阅大会官方网站:http://conf.elasticsearch.cn/
任何咨咨询请发邮件到:zheng.liu@elastic.co
 
继续阅读 »
请不要错过2019年12月7日在北京举行的Elastic 中国开发者大会 2019 (Elastic Dev Day China 2019),本次活动由 Elastic 官方再一次在中国举办的开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats等,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

大会亮点:
  • Elastic 官方在中国组织召开的开发者大会
  • Elastic Stack 7.x 最新功能更新介绍
  • Elastic 官方团队 AMA 展台(Ask Me Anything)
  • 三大主题分会场尽显技术架构、搜索开发和实践应用之美
  • 来自中国互联网头部公司和知名企业的最佳实践干货分享
  • 涵盖搜索数据中台、ELK的容器化和云原生等众多丰富议题
  • 深度剖析大规模搜索生产系统的体系架构、设计演进和平台优化技术



大会日程已经上线:请点击获取大会日程详情!https://www.bagevent.com/event/6072003
 

unnamed_(3).png

unnamed.png

unnamed_(2).png

unnamed_(1).png

 
这是本年度关于ELK、Elasticsearch和企业搜索的最佳盛会;精彩内容岂能错过?座位有限,现在就得动手!

早鸟票还有少量剩余,欢迎前往抢购!

限时提供标准票的9折优惠码,购票时点击“使用优惠或邀请码”,输入:zwsq 即可享受9者优惠!
 

中文社区.png

 
 
关于大会的更多详情请参阅大会官方网站:http://conf.elasticsearch.cn/
任何咨咨询请发邮件到:zheng.liu@elastic.co
  收起阅读 »

Elastic日报 第788期 (2019-11-20)

1、ElasticSearch对接Grafana展示Nginx日志数据
http://t.cn/Aidfzz5j
2、14个Kibana可视化插件,扩展你的认知
http://t.cn/Aidfzz5K
3、Prometheus 监控ES的exporter
http://t.cn/Aidfzz5Q

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

中文社区.png

 
继续阅读 »
1、ElasticSearch对接Grafana展示Nginx日志数据
http://t.cn/Aidfzz5j
2、14个Kibana可视化插件,扩展你的认知
http://t.cn/Aidfzz5K
3、Prometheus 监控ES的exporter
http://t.cn/Aidfzz5Q

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

中文社区.png

  收起阅读 »

Elastic日报 第787期 (2019-11-19)

1、Elasticsearch在日志分析领域应用和运维实践。
http://t.cn/Aid4UsSG
2、UCloud Elasticsearch 服务 UES 应用场景分析。
http://t.cn/Aid44PeJ
3、Elasticsearch在human-in-the-loop NLP领域实践。
http://t.cn/Ai1V7SUo

编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
继续阅读 »
1、Elasticsearch在日志分析领域应用和运维实践。
http://t.cn/Aid4UsSG
2、UCloud Elasticsearch 服务 UES 应用场景分析。
http://t.cn/Aid44PeJ
3、Elasticsearch在human-in-the-loop NLP领域实践。
http://t.cn/Ai1V7SUo

编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub 收起阅读 »

Elastic日报 第786期 (2019-11-18)

1.MongoDB 和 Elasticsearch 的对比
http://t.cn/AidvKp7k
2.elasticSearch 去重查询
http://t.cn/Aidv9i3o
3.elasticSearch 聚合查询套路
http://t.cn/AidvN4mm

编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.MongoDB 和 Elasticsearch 的对比
http://t.cn/AidvKp7k
2.elasticSearch 去重查询
http://t.cn/Aidv9i3o
3.elasticSearch 聚合查询套路
http://t.cn/AidvN4mm

编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

Elastic日报 第785期 (2019-11-17)

1.如何使用Elasticsearch,Logstash和Kibana实时可视化Python中的日志。
http://t.cn/AirgYRf9
2.ELK Stack教程。
http://t.cn/AirgT3LV
3.(自备梯子)什么是情感网站设计?
http://t.cn/AirgEMzv

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.如何使用Elasticsearch,Logstash和Kibana实时可视化Python中的日志。
http://t.cn/AirgYRf9
2.ELK Stack教程。
http://t.cn/AirgT3LV
3.(自备梯子)什么是情感网站设计?
http://t.cn/AirgEMzv

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

Elastic日报 第784期 (2019-11-16)

1.Percolate查询的使用案例
[http://t.cn/Airld2d7](http://t.cn/Airld2d7)
2.K近邻查询插件实现图片相似搜索
[http://t.cn/AirEZoar](http://t.cn/AirEZoar)
3.使用bert和es提供语义搜索
[http://t.cn/AirEZoag](http://t.cn/AirEZoag)


* 编辑:bsll
* 归档:https://ela.st/cn-daily-all
* 订阅:https://ela.st/cn-daily-sub
* 沙龙:https://ela.st/cn-meetup
继续阅读 »
1.Percolate查询的使用案例
[http://t.cn/Airld2d7](http://t.cn/Airld2d7)
2.K近邻查询插件实现图片相似搜索
[http://t.cn/AirEZoar](http://t.cn/AirEZoar)
3.使用bert和es提供语义搜索
[http://t.cn/AirEZoag](http://t.cn/AirEZoag)


* 编辑:bsll
* 归档:https://ela.st/cn-daily-all
* 订阅:https://ela.st/cn-daily-sub
* 沙龙:https://ela.st/cn-meetup
收起阅读 »

Elastic日报 第783期 (2019-11-15)


1、Elasticsearch在NLP领域实践(梯子)
http://t.cn/Ai1V7SUo
2、在Kubernetes中运行Elasticsearch
http://t.cn/Airjq0WT
3、使用Elasticsearch和fscrawler构建基本的搜索引擎(梯子)
http://t.cn/AirjqWkF

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

继续阅读 »

1、Elasticsearch在NLP领域实践(梯子)
http://t.cn/Ai1V7SUo
2、在Kubernetes中运行Elasticsearch
http://t.cn/Airjq0WT
3、使用Elasticsearch和fscrawler构建基本的搜索引擎(梯子)
http://t.cn/AirjqWkF

编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

收起阅读 »

Elastic日报 第782期 (2019-11-14)

1.Elasticsearch 最佳实践系列之分片恢复并发故障
http://t.cn/AirpGazj
2.elasticSearch terms aggregation不准确的总结
http://t.cn/AirpGKrS
3.在elastic机器学习中对异常值检测结果进行基准测试
http://t.cn/AirpGNnt

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
继续阅读 »
1.Elasticsearch 最佳实践系列之分片恢复并发故障
http://t.cn/AirpGazj
2.elasticSearch terms aggregation不准确的总结
http://t.cn/AirpGKrS
3.在elastic机器学习中对异常值检测结果进行基准测试
http://t.cn/AirpGNnt

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »

【深圳ES Meetup】阿里云欧阳楚才:ES实践中最大的业务挑战是保障线上服务稳定

11月16日 Elastic 中文社区深圳 Meetup 上,欧阳楚才将为大家分享 阿里云Elasticsearch内核优化与应用实践。借此机会,我们邀请到他聊聊选ES在阿里云实践过程中遇到的最大业务挑战和解决方案,以及他在高并发架构设计方面的心得。

分享嘉宾 欧阳楚才 搜索技术专家 @阿里巴巴

在阿里巴巴负责Elasticsearch云服务研发工作,有比较丰富的搜索引擎研发经验,熟悉Lucene、Elasticsearch等开源技术,擅长高并发系统架构设计。


Q1、ES 在阿里云实践中遇到最大的业务挑战是什么?如何解决的?

A:阿里云Elasticsearch最大的业务挑战是保障线上服务稳定。通过支持多可用区部署,避免单机房异常导致服务不可用。通过ECS本地盘、ESSD云盘提供高IOPS的存储,避免IO瓶颈导致查询响应慢,使用ECS本地盘也可以降低存储成本。通过ElasticFlow离线构建索引,避免写入和查询争抢资源导致查询响应变慢。通过智能诊断服务Eyou定期检查Elasticsearch服务健康状况,及时发现系统存在的隐患。


Q2、您在高并发系统架构设计方面有哪些心得为大家分享?

A:结合业务场景做容量规划,评估系统需要支撑的写入TPS、查询QPS、最大响应延迟时间。对于Elasticsearch而言,通常最大的瓶颈在磁盘IO,尽量使用SSD盘高性能存储设备。为了系统稳定,单个节点Elasticsearch的JVM内存尽量不要超过32G,单节点存储数据量尽量不要超过5TB,高并发搜索场景推荐单节点配置16核CPU、64G内存、2TB SSD盘。Elasticsearch集群节点数不要超过300个,数据量大的集群根据业务拆分多个集群,配置跨集群搜索。系统上线前做全链路压测,找到系统瓶颈。生产环境开启慢查询日志,分析bad case。


Q3、结合您的实践经历,对 ES 目前的生态发展、应用以及未来有什么样的看法?

A:Elasticsearch是开源的分布式搜索和分析引擎,开箱即用、弹性扩展方便。从早期的ELK到现在的Elastic技术栈,版本迭代持续加速,Elasticsearch的性能、扩展性、相关性不断优化。Elasticsearch最开始设计用于搜索引擎,后来不断被应用到日志分析、数据库加速、安全风控等领域,通过插件扩展机制可以用于图像、视频等非结构化数据分析。


Q4、您对本次技术沙龙活动的主题分享有什么期待?

A:期待能看到更多Elasticsearch应用案例,跟大家一起交流最佳实践。


Q5、您对 Elastic 中文社区发展有什么意见或建议呢?

A:Elastic中文社区之前组织过翻译《Elasticsearch权威指南》中文文档,当时的Elasticsearch版本为2.x,现在的Elasticsearch7.x版本在API、功能方面已经有很大变化,建议组织志愿者更新文档。




11月16日 Elastic 中文社区深圳 Meetup 火热报名中

主题分享:《阿里云Elasticsearch内核优化与应用实践》欧阳楚才
 
主题摘要:Elasticsearch在阿里云上服务了大量的客户,同时也面临着巨大的业务挑战。阿里云ES在内核引擎、中文分词、向量检索、容器化部署等方面做了一系列开发工作,应用于文档、日志、图像、视频的检索与分析。

b89578fa-29bc-49c3-a515-837cf1dcf7c3.png

 
继续阅读 »
11月16日 Elastic 中文社区深圳 Meetup 上,欧阳楚才将为大家分享 阿里云Elasticsearch内核优化与应用实践。借此机会,我们邀请到他聊聊选ES在阿里云实践过程中遇到的最大业务挑战和解决方案,以及他在高并发架构设计方面的心得。

分享嘉宾 欧阳楚才 搜索技术专家 @阿里巴巴

在阿里巴巴负责Elasticsearch云服务研发工作,有比较丰富的搜索引擎研发经验,熟悉Lucene、Elasticsearch等开源技术,擅长高并发系统架构设计。


Q1、ES 在阿里云实践中遇到最大的业务挑战是什么?如何解决的?

A:阿里云Elasticsearch最大的业务挑战是保障线上服务稳定。通过支持多可用区部署,避免单机房异常导致服务不可用。通过ECS本地盘、ESSD云盘提供高IOPS的存储,避免IO瓶颈导致查询响应慢,使用ECS本地盘也可以降低存储成本。通过ElasticFlow离线构建索引,避免写入和查询争抢资源导致查询响应变慢。通过智能诊断服务Eyou定期检查Elasticsearch服务健康状况,及时发现系统存在的隐患。


Q2、您在高并发系统架构设计方面有哪些心得为大家分享?

A:结合业务场景做容量规划,评估系统需要支撑的写入TPS、查询QPS、最大响应延迟时间。对于Elasticsearch而言,通常最大的瓶颈在磁盘IO,尽量使用SSD盘高性能存储设备。为了系统稳定,单个节点Elasticsearch的JVM内存尽量不要超过32G,单节点存储数据量尽量不要超过5TB,高并发搜索场景推荐单节点配置16核CPU、64G内存、2TB SSD盘。Elasticsearch集群节点数不要超过300个,数据量大的集群根据业务拆分多个集群,配置跨集群搜索。系统上线前做全链路压测,找到系统瓶颈。生产环境开启慢查询日志,分析bad case。


Q3、结合您的实践经历,对 ES 目前的生态发展、应用以及未来有什么样的看法?

A:Elasticsearch是开源的分布式搜索和分析引擎,开箱即用、弹性扩展方便。从早期的ELK到现在的Elastic技术栈,版本迭代持续加速,Elasticsearch的性能、扩展性、相关性不断优化。Elasticsearch最开始设计用于搜索引擎,后来不断被应用到日志分析、数据库加速、安全风控等领域,通过插件扩展机制可以用于图像、视频等非结构化数据分析。


Q4、您对本次技术沙龙活动的主题分享有什么期待?

A:期待能看到更多Elasticsearch应用案例,跟大家一起交流最佳实践。


Q5、您对 Elastic 中文社区发展有什么意见或建议呢?

A:Elastic中文社区之前组织过翻译《Elasticsearch权威指南》中文文档,当时的Elasticsearch版本为2.x,现在的Elasticsearch7.x版本在API、功能方面已经有很大变化,建议组织志愿者更新文档。




11月16日 Elastic 中文社区深圳 Meetup 火热报名中

主题分享:《阿里云Elasticsearch内核优化与应用实践》欧阳楚才
 
主题摘要:Elasticsearch在阿里云上服务了大量的客户,同时也面临着巨大的业务挑战。阿里云ES在内核引擎、中文分词、向量检索、容器化部署等方面做了一系列开发工作,应用于文档、日志、图像、视频的检索与分析。

b89578fa-29bc-49c3-a515-837cf1dcf7c3.png

  收起阅读 »

ES脚本性能优化一例

使用painless脚本为文档自定义打分是很常见的场景,对新人来说也是最容易造成性能问题的地方。本文中使用两个例子简单谈一下脚本性能优化。

目标

ES本身是基于倒排等数据结构实现的查询,因此在做类似Term、Match等可以利用底层数据结构的场景进行查询时,性能是很好的。

脚本和term等查询不一样,无法利用现有的各种数据结构,可以简单理解成循环:

docs = getDocs(xxx); // 获取满足条件的文档列表
for(Doc doc : docs) {
    score = getScoreByScript(doc);
}

因此脚本的性能取决于两个地方:脚本的复杂度和满足条件的文档数

例子1

我们有个场景是查询指定坐标指定范围内的POI列表,例如5公里内的景点列表。

由于我们的距离公式和ES默认的都不一致,如下:

/**
 * 计算距离,返回单位:米
 */
public static Double getDistance(Double lat1, Double lng1, Double lat2, Double lng2) {
    double diffLon = Math.abs(lng1 - lng2);
    if (diffLon > 180)
        diffLon -= 360;
    return Math.sqrt(Math.pow(diffLon, 2) + Math.pow(lat1 - lat2, 2)) * 110.0 * 1000;
}

所以该同学把这段Java代码转成了Painless,在sort里使用这个该方法计算出距离。上线以后发现ES有了很多慢查询,对应的服务也95线、99线也比较高。

原因是其他脚本没有有效地缩小数据量,导致有几百万的数据需要使用该脚本做距离计算,给ES的CPU造成很大压力,查询性能也比较差。

该例子优化起来很简单,即使用ES自带的distance做较大范围的限制,例如需要5公里的数据,可以用ES的plain距离做限制,再加上之前的自定义脚本逻辑。由于ES的plain距离计算性能好很多,因此经过该过滤以后,自定义脚本的文档量少了很多,因此整体性能有了很大提升。

例子2

有个场景是对文章进行搜索,如果文章关联的城市是指定的几个城市,则给额外的加分。例如:

{
    "query": {xxx},
    "sort": [
    {
      "_script": {
        "script": {
          "source": "def score = 0;def cityIds = doc['cityIds']; def paramCityIds = params.cityIds; for (int i=0; i<cityIds.size(); i++){if (paramCityIds.contains(cityIds[i])){score += 100;}} return score;",
          "lang": "painless",
          "params": {
            "cityIds": [2,1,3]
          }
        },
        "type": "number",
        "order": "desc"
      }
    }
    ]
}

问题和例子1一样,该功能的性能比较差。虽然脚本简单,但是满足的文档量比较大,带来的计算量也比较多,因此性能上不去。

这是一个比较常见的场景,问题的根源还是对ES的机制不够了解,优化起来也很简单,想办法利用到倒排就可以了。

ES里有个专门针对改场景的查询:constant_score,因此以上查询可以修改为:

{
    "query": {
        "should": [
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 2
                            }
                        },
                        "boost": 5
                     }
            },
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 1
                            }
                        },
                        "boost": 5
                     }
            },
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 3
                            }
                        },
                        "boost": 5
                     }
            }
        ]
    },
    "sort": [
    {
      "_score": "desc"
    ]
}

性能即可得到极大改善。

继续阅读 »

使用painless脚本为文档自定义打分是很常见的场景,对新人来说也是最容易造成性能问题的地方。本文中使用两个例子简单谈一下脚本性能优化。

目标

ES本身是基于倒排等数据结构实现的查询,因此在做类似Term、Match等可以利用底层数据结构的场景进行查询时,性能是很好的。

脚本和term等查询不一样,无法利用现有的各种数据结构,可以简单理解成循环:

docs = getDocs(xxx); // 获取满足条件的文档列表
for(Doc doc : docs) {
    score = getScoreByScript(doc);
}

因此脚本的性能取决于两个地方:脚本的复杂度和满足条件的文档数

例子1

我们有个场景是查询指定坐标指定范围内的POI列表,例如5公里内的景点列表。

由于我们的距离公式和ES默认的都不一致,如下:

/**
 * 计算距离,返回单位:米
 */
public static Double getDistance(Double lat1, Double lng1, Double lat2, Double lng2) {
    double diffLon = Math.abs(lng1 - lng2);
    if (diffLon > 180)
        diffLon -= 360;
    return Math.sqrt(Math.pow(diffLon, 2) + Math.pow(lat1 - lat2, 2)) * 110.0 * 1000;
}

所以该同学把这段Java代码转成了Painless,在sort里使用这个该方法计算出距离。上线以后发现ES有了很多慢查询,对应的服务也95线、99线也比较高。

原因是其他脚本没有有效地缩小数据量,导致有几百万的数据需要使用该脚本做距离计算,给ES的CPU造成很大压力,查询性能也比较差。

该例子优化起来很简单,即使用ES自带的distance做较大范围的限制,例如需要5公里的数据,可以用ES的plain距离做限制,再加上之前的自定义脚本逻辑。由于ES的plain距离计算性能好很多,因此经过该过滤以后,自定义脚本的文档量少了很多,因此整体性能有了很大提升。

例子2

有个场景是对文章进行搜索,如果文章关联的城市是指定的几个城市,则给额外的加分。例如:

{
    "query": {xxx},
    "sort": [
    {
      "_script": {
        "script": {
          "source": "def score = 0;def cityIds = doc['cityIds']; def paramCityIds = params.cityIds; for (int i=0; i<cityIds.size(); i++){if (paramCityIds.contains(cityIds[i])){score += 100;}} return score;",
          "lang": "painless",
          "params": {
            "cityIds": [2,1,3]
          }
        },
        "type": "number",
        "order": "desc"
      }
    }
    ]
}

问题和例子1一样,该功能的性能比较差。虽然脚本简单,但是满足的文档量比较大,带来的计算量也比较多,因此性能上不去。

这是一个比较常见的场景,问题的根源还是对ES的机制不够了解,优化起来也很简单,想办法利用到倒排就可以了。

ES里有个专门针对改场景的查询:constant_score,因此以上查询可以修改为:

{
    "query": {
        "should": [
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 2
                            }
                        },
                        "boost": 5
                     }
            },
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 1
                            }
                        },
                        "boost": 5
                     }
            },
            {
                    "constant_score": {
                        "filter": {
                            "term": {
                                    "cityIds": 3
                            }
                        },
                        "boost": 5
                     }
            }
        ]
    },
    "sort": [
    {
      "_score": "desc"
    ]
}

性能即可得到极大改善。

收起阅读 »