《 ElasticSearch 简介、常用命令及插件介绍》|猫友会-大数据付费群 第五 期

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 《ElasticSearch 简介、常用命令及插件介绍》|猫友会-大数据付费群 第五 期

image.png

白凡-斗鱼搜索引擎负责人

大家好,我是白凡,上海海洋大学硕士毕业,2015 年 1 月进入斗鱼数据平台部, 一直从事斗鱼的搜索服务搭建工作,斗鱼搜索服务几乎全部基于 Elasticsearch。 主要项目包含斗鱼移动端,web 端,PC 端搜索,视频站搜索,鱼吧搜索以及会员查询搜索等服务。2016 年 12 月,参与 Elasitc {ON} DevChina 2016 大会,并 做《基于 Elasticsearch 的斗鱼搜索服务实现》分享。

今天跟大家分享的主题是《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)中,可以画一个简单的对比图

来类比传统关系型数据库: image.png整个搜索过程实现,基本分为两步:创建索引以及搜索,如下图:image.png创建索引:以 Document为对象,以官方默认的“standard”分词器为例。“I love China”,文档首先被分词为“I”,“love”,“China”,然后倒排索引,如下

image.png此时,对于索引“I”,“love”,“China”均对应文档“I love China”。

搜索:搜索时,我们也可设置分词器,对于一个 field,可以分别设置不同的索

引和搜索分词器,如创建索引采用“ik”,搜索采用“standard”,5.x 具体配

置如下: image.png

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”分词 image.png

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 示例 image.png

http://ip:port/my_index/_analyze?text=一战到底,试试&analyzer=ik_smart

这个命令可以用于测试分词器的分词效果。如下: image.png

如果有自定义分词器,也可以通过此命令,进行校验自定义分词器是否满足需求查询命令斗鱼采用的 ES Java API,也可以使用 http 接口,大同小异,在这里, 我就介绍几个重要查询参数设置

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

termQuery,matchQuery:当对搜索输入的数据,需要进行分词时,使用 match,

反之则用 term。

boolQuery:用于拼接查询条件逻辑关系,如“or”“and”

rangeQuery:类似 MySQL,“>”“<”等查询

以 Java API 为例,下图为一组完整的查询语句image.pngElasticSearch 常用插件使用介绍:

head 插件 GitHub:https://github.com/mobz/elasticsearch-head

个人认为这个是 ES 使用中,最为重要的插件,可用于直接查询索引数据,分片状态以及节点状况,界面如下: image.png

其主要功能如下:

1. 图 中 为 我 们 的 测 试 环 境 , 正 式 环 境 可 以 清 晰 看 出 集 群 状 态

(green,yellow,red),master node,data node 状态及各分片在节点分布状态。

2.“动作”选项可轻松实现对索引,开启,关闭,删除等操作。

3.5.x 之后,head 已是一个完全独立的 server,不再需要依附 ES 启动,可以实 现一个 head,通过修改 ip:port,管理多个 ES 集群。

4.“数据浏览”,可以参看集群内所有索引数据。

5.基本查询,可以实现一些基本的数据查询操作。 image.png

6.复合查询,可以通过拼写请求语句,进行复杂的查询操作。

cerebro 插件 GitHub:https://github.com/lmenezes/cerebro

5.x 以前为 kopf 插件,跟 head 一样,5.x,cerebro 作为一个独立的 server,

安装运行。 image.png

其主要功能如下:1.可以查询集群的负载、CPU 状态等数据。2.最重要“index

template”功能,可在界面配置 mapping,极大提高效率,只要指定正确索引名, 索引数据会自动以对应 mappIng 生成。 image.png

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

A&Q:

A: 可以介绍下数据库和 ES 数据同步的方案么?

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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
65 5
|
2月前
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
62 3
|
2月前
|
存储 缓存 分布式计算
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
38 4
|
2月前
|
SQL 分布式计算 NoSQL
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
大数据-170 Elasticsearch 云服务器三节点集群搭建 测试运行
44 4
|
2月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
52 4
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
149 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
SQL 分布式计算 大数据
大数据-168 Elasticsearch 单机云服务器部署运行 详细流程
大数据-168 Elasticsearch 单机云服务器部署运行 详细流程
56 2
|
2月前
|
运维 监控 数据可视化
大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试
大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试
67 1
|
21天前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
34 5
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo