目录

Elasticsearch入门教程

概述

第1章 Elasticsearch 入门

ES 是基于 Lucene 构建的开源的、分布式的、RESTFUL 接口全文搜索引擎。还可以作为一个分布式的数据库,其中每个字段均是被索引的数据且可被搜索。能够扩展至数以百计的服务器存储以及处理 PB 级的数据。可以很短时间内存储搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。 高可用和可扩展是其特点。既可以垂直扩展又可以横向扩展。

ES 的有点:

1. 横向扩展性
2. 分片机制提供更好的分布性
3. 高可用
4. 使用简单

1.2 全文搜索

指计算机搜索程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明这个词在文章中出现的次数和位置,当用户查询的时候搜索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户。 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而成为倒排索引 inverted index。带有倒排索引的文件称为 invered file

路由

当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择,默认情况下,这个值是由文档的 id 决定的。

分片

分片是单个 Lucene 实例,这是 ES 管理比较底层的功能,索引是指向主分片和副本分片的逻辑空间。当发生故障的时候,会把分片移到不同的节点或者添加新的节点。

复制

复制是一个非常有用的功能,不然会有单点问题,当网络中某个节点出现问题的时候,复制可以对故障进行转义,保证系统的高可用。

类型

在索引中可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义具有一组公共字段的文档。

文档

文档是存储在 ES 的一个 JSON 格式的字符串,它就像在关系型数据库中表的一行,每个存储在索引中的一个文档都有一个类型和一个 ID,每个文档都是一个 JSON 对象,存储了零个或者多个字段,或者键值对。原始的 JSON 文档被存储在一个被叫做 source 的字段。当搜索文档的时候默认返回的就是这个字段。

映射

映射可以事先定义,也可以在第一次存储文档的时候自动识别。

升级

ES 通常可以使用滚动升级过程,导致服务不中断。

通用参数

  • pretty 参数,?pretty=true 时,请求的返回值是经过格式化后的 JSON 数据,或者 format=yaml,这可以让返回的结果具有可读的 YAML 格式。

响应过滤

所有的返回值可以通过 filter_path 来减少返回值的内容,多个值可以用逗号分开。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
curl -XGET '127.0.0.1:9200/_search?pretty&filter_path=took,hits.hits._id,hits._score
{
    "took": 3,
    "hits": {
        "hits": {
            {"_id": "3640","_score": 1.0},
            {"_id": "3642","_score": 1.0}
        }
    }
}

建库查看命令

1
http://127.0.0.1:9200/_cat/indices?v

第2章 索引

索引是具有相同结构的文档集合,Elasticsearch 很多操作都是基于索引来完成的。

创建索引

创建索引的时候可以通过修改 number_of_shardsnumber_of_replicas 参数的数量来修改分片和副本的数量。默认分别是5和1。 数量可以通过 update 来修改。通过 PUT 方法,就可以把副本、分片等进行修改。 ES 通过映射来进行字段和数据类型对应。而默认情况下 ES 可以自动识别,也提供 mappings 参数来显式进行映射。

删除索引

ES 为了防止误删除,可以设置 elasticsearch.yml 属性,禁止使用通配符或者 _all 来删除索引。

打开/关闭索引

关闭的索引只能显示索引元数据信息,不能够进行读写操作。

索引映射管理

增加映射

可以向索引添加文档类型,或者向文档类型增加字段。 可以向多个索引添加文档类型,index 要做逗号分隔就可以了。 获取文档字段接口允许你搜索一个或多个子弹,而不是某个索引或者文档类型的全部内容。多个字段也可以逗号分隔。

索引别名

ES 可以对一个或者多个索引指定别名。通过别名可以查询到一个或者多个索引的内容。别名的修改没有响应语法,可以先删除别名,然后再增加别名。

索引分析

首先把一个文本块分析成一个个单独的词 term,为了后面的倒排索引做准备,然后标准化这些词为标准形式,提高他们的可搜索性。这些工作就是分析器 analyzers 所做的。一个分析器是一个组合。包含了字符过滤器、分词器、标记过滤器。ES 提供了很多内置的字符过滤器,分词器和标记过滤器,这些组合起来创建自定义的分析器以应对不同的需求

索引监控

ES 提供了接口来监控索引的状态,包括索引的统计信息、碎片信息、回复的状态和分片的信息,利用这些接口可以随时监控系统索引的状态。

冲洗 flush 操作可以通过接口冲洗一个或多个索引,索引主要通过执行冲洗将数据保存到索引存储并且清楚内部事务日志,以此来释放索引的内存空间,默认的,ES 使用内存启发式算法来自动触发冲洗操作的请求来清洗内存。

分片的选择

默认情况下,分片的选择是通过 ID 的散列值进行控制,这个只可以通过 router 参数并行手动控制。可以在每个操作的基础上直接通过哈希函数的值来指定分片的选择。

索引词频率

term vector 是在 Lucene 中的一个概念,就是对于文档的某一列,如 title, body 这种文本类型的建立词频向量空间。每个词就是一个维度,这个维度的值就是这个词在这个列中的频率。

第 3 章 映射

映射是定义存储和索引的文档类型以及字段的过程。索引中每一个文档都有一个类型,每种类型都有自己的映射。一个映射定义了文档结构内每个字段的数据类型。映射通过配置来定义字段类型与该类型相关联的元数据的关系。

映射类型

每个索引拥有一个或多个映射类型,用来在索引中将文档划分为不同的逻辑组。 每个映射类型拥有,元字段,包括 _index, _type, _id, _source。同一个索引中不同映射类型的相同名称字段必须拥有相同的映射。 对同一个字段进行不同方式的索引是很有用的。

更新当前映射

除了记录以外,现有的映射类型和字段不能更新。修改映射意味着废弃已经索引的文档。

映射参数

  1. analyzer 参数
  2. boost 参数
  3. coerce 参数
  4. copyt_to 参数
  5. doc_values 参数
  6. dynamic 参数
  7. enabled 参数
  8. fielddata 参数
  9. format 参数 在 JSON 格式文档中,日期用字符串表示。ES 利用一系列的预先设定的格式来识别和分析这些字符串,产生一个长整型数值,代表世界标准时间的毫秒数。
1
{"date": {"type": "date", "format": "yyyy-MM-dd"}
  1. geohash 参数
  2. null_value 参数 空值是不能被索引或搜索的,当一个字段设置为 null,这个字段会当没有值的字段,用这个参数可以指定的值来替换掉确切的空值,以便可以被索引和搜索。

第 4 章 搜索

搜索有两种方式,一种是通过 URL 参数进行搜索,另一种是通过 POST 请求参数进行搜索。

  1. URL 参数搜索
1
2
3
# 多个参数用 ? 来分隔
http://172.16.9.6:9200/pi_document_content/test/_search?
http://172.16.9.6:9200/pi_document_content/test/_search?_source_include=cid&q=17402533
  1. POST 请求参数搜索
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
curl -X POST \
  http://172.16.9.6:9200/pi_document_content/test/_search \
  -H 'authorization: Basic bHJ6OnlSLFEzV3gkeHRWVlE0VEpHdA==' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -H 'postman-token: 1f5046e2-e5f2-66a1-9c9c-5fe1f66a6578' \
  -d '{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "chids": {
              "value": "19"
            }
          }
        },
        {
          "term": {
            "cty": {
              "value": "bbs_topic"
            }
          }
        }
      ]
    }
  },
  "size": 1000,
  "_source": ["cid", "cty"]
}'

重新评分

查询单个单词是比较快的,当搜索短语时,效率会比较低。所以 ES 提供了重新评分的方法来提高效率。主要是因为当在整个索引中搜索短语消耗的资源会比较多,但大多数时候,人们只关注最近发生的一部分文档,所以可以先在最近的一段文档中对短语进行重新评分,然后再查询,这个时候效率会高很多。

滚动查询

滚动不适合实时用户请求,适合处理比较多的数据,例如为了重建一个索引到另一个索引中的时候。a

第 5 章 聚合

聚合是基于搜索的数据汇总。通过组合可以完成复杂的操作。

5.1 聚合的分类

  1. 度量聚合,在一组文档中对某一个数字型字段进行计算得出指标值
  2. 分组聚合,创建多个分组,每个分组都关联一个关键字和相关标准
  3. 管道聚合,聚和源是其他聚合的输出,然后进行相关指标的计算

聚合操作的基本结构

1
2
3
4
5
6
7
"aggregations": {
    "<aggregation_name": {
        "<aggregation_type": {<aggregation_body>}
        [, "meta": { [<meta_data_body>] } ]?
        [, "aggregations": { [<sub_aggregation>]+ } ]?
    }
    "<aggregation_name_2": {

5.2 度量聚合

平均值聚合是一个单值度量聚合,计算从聚合的文档中

5.3 分组聚合

分组聚合不像度量聚合那样通过字段进行计算,而是根据文档创建分组。每个聚合都关联一个标准,决定了一个文档在当前的条件下是否会划入分组。

第 6 章 集群管理

6.1 集群节点监控

6.1.1 集群的健康值

可以通过以下请求查看集群的健康值。

1
2
Get http:localhost:9200/_cluster/health?pretty=true
Get http:localhost:9200/_cluster/health/secisland?pretty=true

第 10 章 ELK 应用

Logstash 的配置

配置文件由输入 -> 过滤 -> 输出三个部分组成,每个部分由插件构成,这些插件负责处理日志的不同过程。 每个事件都有不同的属性,比如 apache 的访问日志,可以包括状态码、协议、路径和客户端 ip 等。

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。