70

搜索引擎 Elasticsearch 入门原来这么简单

 4 years ago
source link: https://www.tuicool.com/articles/Bra2Mry
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

近期笔者公司有需求需要将短视频评论数据进行分词词云展示,分析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

Vveymya.jpg!web由于使用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"

INrMNfB.png!web

注意:curl需要指定发送数据的类型为json

ES以及Kibana用法

打开Kibana界面,选择左边的菜单栏,其中Dev tools主要是进行调试开发的页面,Management可以让我们可视化看到当前ES集群中有哪些index。

打开Management,我们可以看到当前 群中已经存在bank索引

77J7n2j.png!web

搜索

接下来正式进入开发阶段,我们打开Dev tools。 使用查询语法来进行搜索,得到如下结果。

GET /bank/_search

{

"query": {

"match_all": {}

}

}

MJziUfb.jpg!web

下面解释一下返回结果:

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"

}

7j22MvJ.jpg!web

配合查询进行使用

GET /bank/_search

{

"query": {

"match": {

"city": "Brogan"

}

},

"size": 0,

"aggs": {

"balance": {

"avg": {

"field": "balance"

}

}

}


以上就是简单的ES入门内容了,如果想要更深入了解ES的话,可以去官网进行查看并深入了解各部分的细节。由于篇幅有限,笔者只是简单分享了ES一部分内容。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK