搜索引擎 Elasticsearch 入门原来这么简单
近期笔者公司有需求需要将短视频评论数据进行分词词云展示,分析TopN内容, 体验了一下搜索引擎的魅力。
此文所有的内容都是基于最新版本的Elastic Search,版本为7.3。 更多用法可以参考官网:
传送门
Elastic Search介绍
Elastic Search是位于Elastic Stack核心的分布式搜索和分析引擎,Logstash和Beats有助于收集、聚合和丰富数据,并且将数据存储在Es中。Kibana有助于我们能够交互式探索、可视化数据并且能够对进行洞察,管理和监控堆栈。
核心概念
- Cluster:
- 一个集群就是由多个节点组织在一起,它们共同持有所有的数据,并提供索引与搜索功能,集群有唯一的名称,节点进行加入时需要指定集群的名称
- Node
- 一个节点简单来说就是一台服务器,默认情况下系统会给节点分配一个名称,也可自行修改
- Index
- 一个索引就是拥有特征的Document,可以存储很多Document
- Document
- 文档做为可被索引的基础信息单元,例如客户的订单数据,一条订单数据作为一个Document存储
- Shards & Replicas
- 分片主要是将数据分布在不同的节点上,这样进行搜索时能够更快的聚合数据,并且能进行水平扩展
- Replicas主要是为了保证集群数据的高可用性而存在的,分布式情况会由于各种情况下导致集群出现问题,有了多分拷贝数据的话可以保证数据的完备性
安装Es并使用
搭建环境是学习花费时间比较头痛的事情,而我们如果想要快速入门的话,可以使用Docker利用其他人构建好的环境来进行搭建。
这样我们可以快速搭建组件并且使用。
docker search elasticsearch
由于使用Kibana能够可视化进行一些操作,我们直接把镜像 nshou/elasticsearch-kibana 拉下来。
docker pull nshou/elasticsearch-kibana
这样等我们拉取完毕以后,就可以启动容器来使用es和kibana了,Es默认端口为9200,Kibana默认端口为5601
docker run -it -d -p 9200:9200 -p 5601:5601 nshou/elasticsearch-kibana
使用docker ps 查看我们当前的运行状态
docker ps
如果能看到当前容器运行状况说明已经运行成功,浏览器输入
http://localhost:5601
查看是否能够访问Kibana
导入index数据
ES可以采用rest api以及Client模式进行交互,此处我们使用rest api的形式先导入数据,可以直接找到官网的accounts.json,使用wget进行下载
wget https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json?raw=true
下载好以后名称可能
不为 accounts.json,自行更改数据为accounts.json
mv accounts.json\?raw\=true accounts.json
然后调用批量api进行数据导入
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
注意:curl需要指定发送数据的类型为json
ES以及Kibana用法
打开Kibana界面,选择左边的菜单栏,其中Dev tools主要是进行调试开发的页面,Management可以让我们可视化看到当前ES集群中有哪些index。
打开Management,我们可以看到当前
集
群中已经存在bank索引
搜索
接下来正式进入开发阶段,我们打开Dev tools。
使用查询语法来进行搜索,得到如下结果。
GET /bank/_search { "query": { "match_all": {} } }
下面解释一下返回结果:
took: 表示此次查询花费的时间 timed_out: boolean 类型, 是否超时 _shards: { // 查询使用到的shards数, 成功数, 跳过数 以及失败数量 "total": 2, "successful": 2, "skipped": 0, "failed": 0 }, "hits" : { "total" : { // 总共检索了多少个文档 "value" : 1000, // 方式 "relation" : "eq" } }
我们还可以使用其他方式来查询, match_phrase 表示使用短语查询 “880 Holmes Lane” 会当成一个短语来进行查询
GET /bank/_search { "query": { "match_phrase": { "address": "880 Holmes Lane" } } }
如果使用match进行查询,则会将”880 Holmes Lane”,先分词为”880″, “Holmes”, “Lane” 然后进行查询,返回的结果包含至少其中一个关键词的数据
GET /bank/_search { "query": { "match": { "address": "880 Holmes Lane" } } }
分词
可以使用标准的分词器来进行英语词句的分析,也可以使用IK的分词器来针对中文进行分词。偷偷告诉你,aliyun的ES还可以使用alinlp进行分词,笔者还未进行使用,但后续用于生产时配置高时可以开启。
GET /bank/_analyze { "analyzer": "standard", "text": "Is that your car" }
配合查询进行使用
GET /bank/_search { "query": { "match": { "city": "Brogan" } }, "size": 0, "aggs": { "balance": { "avg": { "field": "balance" } } }
以上就是简单的ES入门内容了,如果想要更深入了解ES的话,可以去官网进行查看并深入了解各部分的细节。由于篇幅有限,笔者只是简单分享了ES一部分内容。