首页>会议文档 >

斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现

page:
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现
斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现

斗鱼 白凡——基于Elasticsearch的 斗鱼搜索服务实现

所属会议:Elastic 中国开发者大会 2016会议地点:北京


下载

手机看
活动家APP客户端

扫二维码下载
或点击下载
Android iOS

8143次
浏览次数

文档介绍

主要针对Elasticsearch在斗鱼主站、鱼吧、点播系统、移动端等搜索项目中应用及其性能调优,进行演讲介绍,具体内容包含以下几点: 1.斗鱼主站、鱼吧、点播系统、移动端等不同业务环境下,ES集群搭建、搜索接口调用、mapping创建及配置设置。 2.斗鱼搜索技术架构,接口采用Nginx处理一级缓存以及负责均衡,tomcat实现索引同步及搜索接口,以ES,MySQL,Redis为基础的数据存储。 3.斗鱼搜索服务缓存处理,高并发应对策略。 4.由于斗鱼网络科技有限公司的语言异构性,搜索集群如何处理数据同步。 5.斗鱼搜索基于Zabbix+ELK的监控环境搭建,日志收集。 6.以及在搜索开发过程中遇到的接口问题、集群环境问题,并发负载问题以及解决方法的分享。 7.以及未来对搜索服务规划,服务接口化,统一工程分化,docker化。

演讲实录

今天跟大家分享的主题是《ElasticSearch简介、常用命令及插件介绍》,主要跟大家分享一些ElasticSearch在搜索中的应用,常用命令及插件介绍。

此次分享我分成3个部分,分别是:
1、ElasticSearch基本介绍;
2、ElasticSearch常用命令介绍;
3、ElasticSearch常用插件使用介绍


ElasticSearch基本介绍

ElasticSearch是Elasitc stack下最重要一个成员,基于开源框架ApacheLucence,
GitHub地址:https://github.com/elastic/elasticsearchES
官网:https://www.elastic.co/

在学习ES时,虽然有由elastic 华中地区负责人medcl创办的中文社区,也有中文翻译的《官方权威指南》,本人也有幸参与其中部分的翻译工作,比较了解翻译质量。所以建议学习,尽量以官网文档为主,不清楚的,先动手做,再思考,再提问。

比如,经常有收到网友问,集群设置多少分片,设置多少数据节点,master节点问题。最好的解决方案,自己拿着数据去测,去实验,满足自己的性能要求,想怎么玩都可以。斗鱼的搜索服务,由ES 1.x->2.x->5.x,所以,本次介绍基本以ES 5.x为主。

言归正传,ElasticSearch或者Lucence是如何实现搜索的呢?首先,先来简介Lucence的相关度计算:词条频度/倒排文档频度(TF/IDF)

词条频度(Term Frequency)词条在当前文档中越频繁的话,那么权重就越高。在一个字段中出现了5次的词条应该比只出现了1次的文档更加相关。

词条频度通过下面的公式进行计算:tf(t in d) = √frequency词条t在文档d中的词条频度tf,是该词条在文档中出现次数的平方根。

字段长度归约(Field-length Norm)字段越短,那么其权重就越高。如果一个词条出现在较短的字段,如title字段中,那么该字段的内容相比更长的body字段而言,更有可能是关于该词条的。

字段长度归约的计算方法如下:norm(d) = 1 / √numTerms尽管字段长度归约对于全文搜索而言是重要的,也有许多其它字段不需要。无论文档是否含有该字段,对于索引中每份文档的每个字符串字段,归约大概需消耗1个字节的空间。

结合起来词条频度,倒排文档频度以及字段长度规范 - 都是在索引期间被计算和保存的。它们被用来计算单个词条对于某一份文档的权重。

ES数据模型以Document(文档)为单位。在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,可以画一个简单的对比图来类比传统关系型数据库:

整个搜索过程实现,基本分为两步:创建索引以及搜索,如下图:

创建索引:以Document为对象,以官方默认的“standard”分词器为例。“I love China”,文档首先被分词为“I”,“love”,“China”,然后倒排索引,如下图

此时,对于索引“I”,“love”,“China”均对应文档“I love China”。
搜索:搜索时,我们也可设置分词器,对于一个field,可以分别设置不同的索引和搜索分词器,如创建索引采用“ik”,搜索采用“standard”,5.x具体配置如下:

douyu_analyzer和douyu_synonyms分别为我们自定义的分词器。
回到例子,搜索时,依然采用“standard”分词器,如搜索“I China”,则搜索语句被分词为“I”,“China”。

然后ES会拿着该搜索索引与现有文档的倒排索引比较,发现“I love China”内对应两个分词,于是返回“I love China”结果。

一套良好的搜索系统需要运用大量的分词器来完善。斗鱼目前主要用到分词器有“IK中文词”,“ngram分词”(用于替换wildcard搜索接口,有效实现通配符匹配),“正则分词”“拼音分词”以及“同义词分词”等。

IK中文分词,GitHub:https://github.com/medcl/elasticsearch-analysis-ik由ES华中区负责人medcl贡献。可以满足斗鱼部分对于自定义分词的需求。

ngram分词,官方分词器,虽然官方有wildcard可以实现类似sql like *xxx* 通配符匹配,但搜索性能极差,严重慢查询。

后采用ngram分词替换,其原理如下:依然以“I love China”为例,分词为“I”,“love”,“China”,“I love”,“love China”,“I love China”。从而搜索“love”,可实现“*love*”查询。但该类分词方式会产生大量分词索引,不适用于对大型文章或新闻类的分词。

正则分词,官方分词器,实现部分正则分词。
拼音分词,GitHub:https://github.com/medcl/elasticsearch-analysis-pinyin顾名思义,主要实现文档的拼音分词。 同义词分词,GitHub:https://github.com/codelibs/elasticsearch-analysis-synonym


ElasticSearch常用命令介绍

创建mapping,相当于MySQL创建table,需要注意的是,如果String类型数据,不设置分词或者也不把类型设置为“keyword(相当于2.x not_analyzed,即不分词)”,则ES会设置为默认的“standard”分词

insertcurl-XPUT 'http://ip:port/my_index/my_index/123' -d '{ "room_id" :"231", "room_name" : "模拟人生好玩吗?","nickname" : "斗鱼"}'

这里insert可以指定_id 123,也可以不设置,ES会自动分配唯一的hash值,自己指定_id的好处在于,便于后续的updateupdatecurl-XPOST 'ip:port/my_index/my_index/123/_update' -d '{ "doc" : {"room_name" : "修改测试123" }}'

大量的update对于磁盘I/O和ES内存都会产生很大压力。对于ES 5.x 如果仅仅只做日志收集,有专门的apprend only模式。
下图为Java API示例

http://ip:port/my_index/_analyze?text=一战到底,试试&analyzer=ik_smart
这个命令可以用于测试分词器的分词效果。如下:

如果有自定义分词器,也可以通过此命令,进行校验自定义分词器是否满足需求
查询命令斗鱼采用的ES Java API,也可以使用http接口,大同小异。

在这里,我就介绍几个重要查询参数设置boost:权重分配,影响排序最重要方法手段之一,由于Lucence底层算法为线性叠加,所以改值可以设置为负数,从而使某字段命中,为降权影响。

termQuery,matchQuery:当对搜索输入的数据,需要进行分词时,使用match,反之则用term。
boolQuery:用于拼接查询条件逻辑关系,如“or”“and”
rangeQuery:类似MySQL,“>”“<”等查询。

以Java API为例,下图为一组完整的查询语句:


ElasticSearch常用插件使用介绍

head插件GitHub:https://github.com/mobz/elasticsearch-head
个人认为这个是ES使用中,最为重要的插件,可用于直接查询索引数据,分片状态以及节点状况,界面如下:

其主要功能如下:

1.图中为我们的测试环境,正式环境可以清晰看出集群状态(green,yellow,red),master node,data node状态及各分片在节点分布状态。
2.“动作”选项可轻松实现对索引,开启,关闭,删除等操作。
3.5.x之后,head已是一个完全独立的server,不再需要依附ES启动,可以实现一个head,通过修改ip:port,管理多个ES集群。
4.“数据浏览”,可以参看集群内所有索引数据。
5.基本查询,可以实现一些基本的数据查询操作。

6.复合查询,可以通过拼写请求语句,进行复杂的查询操作。
cerebro插件GitHub:https://github.com/lmenezes/cerebro5.x以前为kopf插件,跟head一样,5.x,cerebro作为一个独立的server,安装运行。

其主要功能如下:

1.可以查询集群的负载、CPU状态等数据。
2.最重要“index template”功能,可在界面配置mapping,极大提高效率,只要指定正确索引名,索引数据会自动以对应mappIng生成。

权限控制插件对于所有ES使用者,可能最头疼的就是权限控制,官方有sheild插件,用户可以通过官方渠道购买。当然,也可以通过限制ES访问ip,端口,自己写一套权限管理工具。

×

打开微信扫一扫,分享到朋友圈