Elasticsearch 入门

简介

Elasticsearch 是一个非常强大的开源的全文搜索引擎,它可以近实时地存储、搜索和分析海量数据

Elasticsearch 通常简称为 ES。

ES 是由 Java 开发,并使用 Lucene 作为其核心库来实现索引和搜索的功能。

Lucene 就是一个 jar 包,里面包含了各种建立倒排索引的方法。Lucene 是迄今为止最先进、性能最好、功能最全的搜索引擎库。

ES 的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。

可以通过简单的 RESTful API、各种语言的客户端或者命令行与 ES 进行交互。

典型应用

Elasticsearch 的一个典型应用就是 ELK。

ELK 是一个非常成熟的收集、存储、处理和分析日志的系统,它由三个开源软件组成。

  • Elasticsearch:分布式的搜索引擎,主要负责存储、搜索和分析数据。它是 ELK 的核心,不可替代。
  • Logstash:收集系统,Logstash 和 Beats 主要负责数据的抓取和过滤。
  • Kibana:数据可视化系统,可为 Elasticsearch 提供友好的 Web 操作界面。

核心概念

Index

Index 索引库是具有相同类型(结构)的文档集合。

Index 相当于 MySQL 的数据表。

在 ES 中索引库也可以有多个,index 的复数形式为 indexes 或 indices。

ES 会对数据进行处理,根据关键字或词条建立倒排索引(Inverted Index,也叫反向索引)。

index(索引库)的名称必须全部小写,不能以下划线开头,不能包含逗号。

倒排索引

  • document 文档:每条数据就是一个文档。
  • term 词条:将文档的内容按照语义进行分词,并基于词条建立索引。记录词条所在的文档信息。

比如小米手机,会分成两个词条,小米、手机。搜索时,也先进行分词,可快速找到和分词相关的所有文档 id,再根据文档 id 检索出整个文档的内容。这就是倒排索引。

默认情况下,文档中的所有字段都会被索引(拥有一个倒排索引)。

Document

document(文档)是 index (索引库)中的单条记录,类似于 MySQL 中的数据行。

ES 是面向文档(document oriented)的,这意味着它可以存储整个对象或文档。

然而,它不仅仅是存储,还会索引每个文档的内容使之可以被搜索。你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是 ES 能够执行复杂的全文搜索的原因之一。

ES 采用 JSON 作为文档序列化的格式。

例如,用 JSON 文档表示一个用户对象:

{
    "email": "john@smith.com",
    "first_name": "John",
    "last_name": "Smith",
    "full_name": "John Smith",
    "info": {
        "age": 25,
        "interests": [ "games", "musics" ],
        "address": "guangdong shenzhen nanshan"
    },
    "created_at": "2019-06-06 08:30:10"
}

同一个 Index 里面的 Document,最好是一致的结构。

Mapping

Index 中文档的所有的字段约束信息,类似 MySQL 的数据表结构。

Type

Document 可以被分类(分组),这个分类就是 Type(类型)。它是一种虚拟的逻辑分类。

类型完全不同的数据(比如 users 和 logs)应该存到两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

Elasticsearch 6.x 版本只允许每个 Index 包含一个 Type,7.x 版本已彻底移除 Type。详情可查看 Elasticsearch 官网的使用手册

总结

Elasticsearch 和 MySQL 的相关概念区分。

概念MySQLElasticsearch
数据表tableindex
记录(行)rowdocument
字段columnfield
索引B-tree 索引倒排索引
操作语句SQLDSL

ES 除了可以用于日志数据的存储分析。还可以用于网站首页的搜索,海量数据的复杂查询。

下载与安装

准备工作

ES 需要 Java 8 运行时环境的支持。这里只介绍 Windows 版本的安装。

安装 Elasticsearch 唯一的要求是安装官方新版的 Java,地址:https://www.java.com

防火墙或防病毒软件可能会妨碍 Java 的正确安装。在成功安装 Java 之后,再来打开防火墙或防病毒软件。

下载 ES

官网下载地址:各版本的 ES 下载地址

说明: Windows 版本的 ES,可以是 zip 的压缩包。

安装 ES

  1. 将下载的 elasticsearch-5.5.2.zip 压缩包拷贝至安装目录,并解压。
  2. 打开 CMD 命令行,切换至 E:\Program Files\Elastic Stack\elasticsearch-5.5.2 目录。
  3. 启动 ES(有两种方式)。
  • 直接双击 bin 目录中的 elasticsearch.bat
  • 用 CMD 命令,执行 .\bin\elasticsearch.bat

注意: elasticsearch 不能用 root 用户运行。

可能遇到的问题:

Error: missing server' JVM atC:\Program Files (x86)\Java\jre1.8.0_211\bin\server\jvm.dll'. Please install or use the JRE or JDK that contains these missing components.

解决方法:

在 C:\Program Files (x86)\Java\jre1.8.0_211\bin 目录中,创建一个 server 目录,然后将 bin\client 目录中的所有文件拷贝到 bin\server 目录中。

可能遇到的问题2:

Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

解决方法:

编辑 E:\Program Files\Elastic Stack\elasticsearch-5.5.2\config\jvm.options 文件,将

-Xms2g
-Xmx2g

修改为

-Xms512m
-Xmx512m

测试 ES 是否正常运行

ES 的默认端口是 9200,打开浏览器,访问 http://localhost:9200 ,如果一切正常,返回结果为:

{
  "name" : "w5mKYlb",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ijhW0uayQCax-nHRUq5jww",
  "version" : {
    "number" : "5.5.2",
    "build_hash" : "b2f0c09",
    "build_date" : "2017-08-14T12:33:14.154Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

说明: ES的配置文件是 config/elasticsearch.yml,默认情况下,无需更改配置。

安装 Kibana

前面说过,Kibana 是一个可视化平台,它提供了一个友好的 Web 界面,可与 Elasticsearch 进行各种交互。

注意: Kibana 的版本必须与 Elasticsearch 一致。

这里,我们下载 kibana-5.5.2-windows-x86.zip。

解压后,进入 kibana-5.5.2-windows-x86 目录。

启动方式有两种:

  • 直接双击 bin 目录中的 kibana.bat
  • 用 CMD 命令,执行 .\bin\kibana.bat

Kibana 的默认端口为 5601。

打开浏览器,访问 http://localhost:5601 即可。

然后,就可以在 Web 界面的 Dev Tools -> Console 中,与 Elasticsearch 进行交互了。

API

我们可以通过以 JSON 为数据交互格式的 RESTful API 与 Elasticsearch 进行通信。

Elasticsearch 官方提供了多种语言的客户端(Javascript, .NET, PHP, Perl等)使用 RESTful API,通过 9200 端口与 Elasticsearch 进行通信。也可以使用 WEB 客户端(如 Kibana)与 Elasticsearch 进行通信。

此外,你甚至可以直接使用 curl 命令与 Elasticsearch 进行通信。

与 Elasticsearch 进行通信就如同发送普通的 HTTP 请求一样简单。

基本格式如下:

curl -X<VERB> <PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING> -d '<BODY>'
  • VERB:HTTP 动词(请求类型),分为 GET、POST、 PUT、HEAD、DELETE 等。
  • PROTOCOL:http 或者 https 协议(只有在 Elasticsearch 前面有 https 代理时可用)。
  • HOST:主机名或主机 IP。
  • PORT:端口。Elasticsearch HTTP 服务所在的端口,默认为 9200。
  • PATH:API 的路径。
  • QUERY_STRING:可选的查询请求参数。比如:?pretty 参数将使请求返回更加美观易读的 JSON 数据。
  • BODY:一个 JSON 格式的请求主体(需要发送的数据)。

查看集群的健康状态

curl -X GET localhost:9200/_cat/health?v

例如:统计集群中文档的数量。

curl -XGET http://localhost:9200/_count?pretty -d '
{
    "query": {
        "match_all": {}
    }
}'

得到如下的 JSON 格式的响应主体:

{
  "count": 1,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  }
}

如果想在返回结果中看到 HTTP 响应头,可以在 curl 命令后加上 -i 选项。例如:

curl -i -XGET localhost:9200

返回结果:

HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 327

{
  "name" : "Al4cFdA",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "99fvFyReR-iRknIbc92r3Q",
  "version" : {
    "number" : "5.5.2",
    "build_hash" : "b2f0c09",
    "build_date" : "2017-08-14T12:33:14.154Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

curl 简写

对于一个完整的 curl 请求,例如:

curl -XGET http://localhost:9200/_count?pretty -d '
{
    "query": {
        "match_all": {}
    }
}'

一般会简写成:

GET /_count
{
    "query": {
        "match_all": {}
    }
}

其实,在 Kibana 的控制台(Console),采用的就是这种简写形式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值