文档章节

ElasticSearch简介、常用命令及插件介绍

JKXQJ
 JKXQJ
发布于 2017/09/06 15:01
字数 2227
阅读 51
收藏 0

转载地址 : https://mp.weixin.qq.com/s/QMvKgtHWdDvg9E39wuqRwg

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的好处在于,便于后续的update
updatecurl -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/cerebro
5.x以前为kopf插件,跟head一样,5.x,cerebro作为一个独立的server,安装运行。

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

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

A&Q:
A: 可以介绍下数据库和ES数据同步的方案么?
Q: RocketMQ,实时性、稳定性最好,可复用,需要中间插件,比较推荐。数据源为Canal解析binlog,亦或前端直接通过HTTP请求POST增量数据。只要设置不同的Group,可共同消费。Redis队列,实时性、稳定性好,不可复用,需要中间插件。采用Redis队列进行消费,但不可复用,只能一个服务端消费,且如果未做持久化、一旦Redis挂掉,数据不可恢复。定时任务,无需中间件,但实时性、稳定性不好。通过更新时间定时更新增量索引,一旦任务挂掉,时间点一过,则不可恢复。且对更新时间非常敏感,必须为写入数据库时间。

本文转载自:http://blog.csdn.net/jkxqj/article/details/77430540

JKXQJ
粉丝 0
博文 15
码字总数 0
作品 0
武汉
程序员
私信 提问
Elasticsearch介绍和安装

版权声明:https://blog.csdn.net/weixin43814195?t=1 https://blog.csdn.net/weixin43814195/article/details/85275156 Elasticsearch 1.简介 1.1基本概念 Elasticsearch是基于Lucene的全文......

MIss.Fan
2018/12/27
0
0
ElasticSearch的介绍及使用

1.ElasticSearch 简介 : 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源...

全世界最好的肥猪精
2018/12/23
0
0
快速上手 Elasticsearch 的几个建议

相信不少同学都听说过 Elasticsearch,作为目前最流行的搜索引擎实现方案,越来越多的公司在自己的架构中引入,而其应用场景也从搜索引擎扩展到了日志存储分析、大数据分析领域,本文尝试给初...

rockybean
2018/05/21
0
0
elasticsearch-head 安装介绍

elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head 插件的安装在 Linux 和 Windows 没什么区别,安装之前确保当前系...

BeckJin
2018/05/19
0
0
使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch

本文介绍如何使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch。 1.go-mysql-elasticsearch简介 go-mysql-elasticsearch是一个将MySQL数据自动同步到Elasticsearch的服务。 它...

dalaoyang
06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部