2020年1月14日

Elasticsearch功能介绍

作者 codecafe

Elasticsearch是什么?

ElasticSearch是一个基于Lucene的高可用、高可扩展的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

Lucene是apache软件基金会的一个子项目,是一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。

能做什么/为什么要用es?

搜索

全文检索、评分、倒排索引。可以用于电商网站、门户网站、企业IT系统等各种场景下的搜索引擎,也可以用于对海量的数据进行近实时的数据分析。

可适用于任何需要搜索功能的地方,代替关系行数据库like的不足。es索引是基于内存的高效处理。

日志分析

分析和挖掘这些数据,寻找趋势,统计,总结,或异常。

kibana是elasticsearch的一个可视化插件。日志分析处理可用logstash+elasticsearch+kibana来进行日志的搜集、存储、分析展示,这三个软件在es官网都有提供。
kibana功能列表

处理地理数据

可用于基于经纬度范围查询,电子围栏(指定图形边界坐标,查找该范围内的所有坐标点)。

搜索自动补全

es自动补全应用

拼音搜索

    // 拼音搜索"北京一日游"
    GET /travel_content-*/_search
    {
      "query": {
        "term": {
          "title.pinyin": {
            "value": "bjyry" 
          }
        }
      }
    }

搜索结果:
搜索结果

机器学习

es 提供了基于时序的数据预测,同时提供了对异常数据通过email、webhook等方式进行推送,开箱即用,很适合基于时序的数据预测。
机器学习异常点检测

es的机器学习是什么


基本概念

集群(cluster)

一个集群就是由一个多个节点组织在一起,它们共同持有你全部的数据, 并一起提供索引和搜索功能。一个集群由一个唯一的名字标识, 这个名字默认就是“elasticsearch”。

Elasticsearch功能介绍插图(2)

节点(node)

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。 默认情况下,如果在网络中启动了若干个节点, 并假定它们能够相互发现彼此,它们将会自动地形成并加入到集群中。

节点类型

  • Master: 候选主节点,有机会被选举为控制集群的主节点,
    创建、删除索引,分配分片,主节点选举过程
  • Ingest: 摄取节点,对文档进行索引之前做预处理
  • Data: 数据节点,执行数据相关的操作,包括搜索/聚合/CRUD
  • Machine learning: 机器学习节点,专门用于机器学习
  • Coordinate node 协调节点是一种角色,不是真正的物理节点。一个节点只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点,每个节点都是协调节点,可以关闭某一节点的数据存储、master选举功能来作为专门的协调节点。

在一个集群里可以拥有任意多个节点。

Elasticsearch功能介绍插图(3)

索引(index)

一个索引就是一个拥有相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来 标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,你能够创建任意多个索引。

类型(type)

es 7.0版本前,在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台 并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
7.0之后已经不建议指定类型.

文档(document)

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档、某一个产品的一个文档、某个订单的一个文档。文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式。

分片(shard)

一个分片就是一个lucene实例,是一个完整的搜索引擎。一个索引中的分片会均匀的分布在各data节点上,因此,分片有助于横向扩展(增加机器)。

段(segment)

elasticsearch中的每个分片包含多个segment,每一个segment都是一个倒排索引;在查询的时,会把所有的segment查询结果汇总归并后最为最终的分片查询结果返回;

副本(replica)

副本是针对索引设置的,一个索引可以设置多个副本,可以动态增加、删除副本,副本具有和主索引完全一样的数据。副本建立后,会均匀的分布在集群的各个节点上,为数据容灾提供保证。

Elasticsearch功能介绍插图(4)

图中有一个主分片,两个副本分片,分别分布到了三个节点上。任意两个节点故障,都可以从另一个节点来进行恢复。


搜索基础

搜索基础—倒排索引

  • 原始文档

Elasticsearch功能介绍插图(5)

  • 建立倒排索引

Elasticsearch功能介绍插图(6)

如何进行全文索引的

分析器进行分析,分词/过滤

一旦组成了词项列表,这个查询会对每个词项逐一执行底层的查询,再将结果合并,然后为每个文档生成一个最终的相关度评分。

相关度评分

Lucene(或 Elasticsearch)使用布尔模型(Boolean model) 查找匹配文档, 并用一个名为实用评分函数(practical scoring function) 的公式来计算相关度。这个公式借鉴了 词频/逆向文档频率(term frequency/inverse document frequency) 和 向量空间模型(vector space model),同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。

相关度评分背后的理论

分析器

支持多种语言分析器,中文是以插件的形式来提供支持(ik分析器),有通用的standard分析器。

快速定位存储位置

shard = hash(routing) % number_of_primary_shards

routing:文档id
从原理到应用,Elasticsearch详解


Elasticsearch 优势

  • 近实时
  • 生态圈发展很好
  • 分布式,横向扩展简单,增加机器。
  • 高可用,设置副本分片使某台机器宕机的时候任可正常运行。

Elasticsearch 特点

  • 单个索引的大小可以不受的节点存储限制,文档可以储存在一个或多个节点中
  • 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
  • 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
  • 将集群中任一节点的请求路由到存有相关数据的节点
  • 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复

如何使用?

linux 安装部署

  • 编写shell安装脚本
  • ansible 配置跨节点安装
  • supervisor 保活

es单节点安装、配置

原生dsl查询

sql 查询 elasticsearch

参考: php通过sql查询elasticsearch

配置优化

写入优化

  • 写入时,关闭副本
  • 延长持久化时间间隔
refresh_interval:5s

查询优化

  • 在查询是需要查多个字段时,可以在写入的时候设置coop_to mapping 将多个字段自动写到同一个新的字段,查询的时候查新的这个字段。
  • 对常用的range索引,添加新字段进行存储,以使用term聚合。如:
GET test/_search
{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 10 },
          { "from": 10, "to": 100 },
          { "from": 100 }
        ]
      }
    }
  }
}

可改为

PUT index/_doc/1
{
  "designation": "spoon",
  "price": 13,
  "price_range": "10-100" # 提前计算好范围
}
  • 将不需要range范围查询的数值类型改为keyword,查询更快。
  • 搜索日期尽量避免now,不可缓存。
  • 将不再改变的索引的segment合并成更大的端,提高搜索性能。

提前设计

  • 索引别名
  • 分片设计
  • 副本设计
  • 基于时间序列的数据存储技巧
    按时间创建索引,刚开始你可能一个月才需要创建一个索引,但是到后面,你一天就需要创建一个索引,这样就变得很简单。
  • 索引模版
    相同类型的数据不需要重新设计mapping

es周边

  • kibana es配套的可视化展示工具
  • logstash 数据导入、预处理工具,提供输入、过滤、输出功能
  • filebeat 日志收集工具,可配合logstash一起使用
  • sql 客户端
  • restful 调用
  • 特有的json格式的dsl查询

其他

相关文档