搜索引擎 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一部分内容。