ElasticSearch入门-初级

一、ElasticSearch概述

1. 概念阐述
  • ES(ElasticSearch)是一款非常强大的开源搜索引擎;
  • ES是分布式实时搜索,实时分析,支持PB级数据的实时存储引擎,可以帮助我们从海量数据中快速的找到相应的内容;
  • 除了搜索,结合Kibana Logstash Beats,Elastic stack还被广泛使用在大数据、近实时分析的领域,包括日志分析、指标监控、信息安全等多个领域。可以帮助我们探索海量的、结构化的、非结构化的数据,按需创建可视化报表、对监控数据设置报警阈值、甚至使用机器学习的技术自动识别异常和状况,及时发出警报;
  • ES是基于Java语言开发搜索引擎类库;
  • 基于Apache Lucene开源搜索引擎,Lucene是目前工人性能最好、最先进的、功能最全的搜索引擎;
  • ES使用Lucene作为核心来实现所有索引和搜索的功能,通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文检索变得简单。(从10亿的数据检出一条只需1-2秒)

官网https://www.elastic.co/cn/

2 功能特点
2.1 功能
  • 海量数据的分布式存储及集群管理能力:服务于数据的高可用,水平扩展;
  • 近实时搜索,性能卓越:结构化 / 全文 / 地理位置 / 自动完成;
  • 海量数据的近实时分析: 指聚合功能;
2.2 特点
  • 集群规模可以从单个节点扩展至数百个节点
  • 高可用 & 水平扩展:从服务和数据两个维度
  • 支持不同的节点类型:支持Hot & Warm架构
  • 支持多种方式集成接入
  • 近实时(Near Real Time)
  • 分布式存储/搜索/分析
3 版本与升级
3.1 版本发布
  • 0.4: 2010年2月第一次发布
  • 1.0: 2014年1月
  • 2.X: 2015年5月
  • 5.X: 2016年10月
  • 6.X: 2017年10月
  • 7.X: 2019年4月

Elastic 产品生命周期结束 (EOL) 日期:https://www.elastic.co/cn/support/eol

3.2 版本特性
  • 5.X

    • Lucene 6.x, 性能提升,默认打分机制从TF-IDF改为BM25
    • 支持Ingest节点/ Painless Scripting / Completion suggested支持/原生的Java REST客户端
    • Type标记成deprecated, 支持了Keyword的类型
    • 性能优化
      • 内部引擎移除了避免同一文档并发更新的竞争锁,带来15% - 20%的性能提升
      • Instant aggregation, 支持分片上聚合的缓存
      • 新增了Profile API
  • 6.X

    • Lucene 7.x
    • 新功能
      • 跨集群复制(CCR)
      • 索引生命周期管理
      • SQL的支持
    • 更友好的的升级及 数据迁移
      • 在主要版本之间的迁移更为简化,体验升级
      • 全新的基于操作的数据复制框架,可加快恢复数据
    • 性能优化
      • 有效存储稀疏字段的新方法,降低了存储成本
      • 在索引时进行排序,可加快排序的查询性能
  • 7.X

    • Lucene 8.0
      • 重大改进-正式废除单个索引下多Type的支持
      • 7.1开始,Security 功能免费使用
      • ECK - Elasticseach Operator on Kubernetes
    • 新功能
      • New Cluster coordination
      • Feature-Complete High L evel REST Client
      • Script Score Query
    • 性能优化
      • 默认的Primary Shard数从5改为1, 避免Over Sharding
      • 性能优化,更快的Top K
4 ElasticSearch生态圈
4.1 生态圈
生态圈
4.2 Logstash特性
  • 实时解析和转换数据

    • 从IP地址破译出地理坐标
    • 将PII 数据匿名化,完全排除敏感字段
  • 可扩展

    • 200多个插件(日 志/数据库/Arcsigh/Netflow)
  • 可靠性安全性

    • Logstash会通过持久化队列来保证至少将运行中的事件送达一次
    • 数据传输加密
  • 监控

4.3 kibana特性
kibana特性
4.4 Beats - 轻量数据采集器
Beats - 轻量数据采集器
ELK应用场景
  • 应用场景

    • 网站搜索/垂直搜索/代码搜索
    • 日志管理与分析/安全指标监控/应用性能监控/WEB抓取舆情分
  • 应用公司


    应用场景
  • 指标日志分析

指标日志分析

二、ElasticSearch安装和简单配置

1 本地部署 & 水平扩展
  • 开发环境部署
  • 单节点,一个节点承担多种角色
  • 单机部署多个节点


    本地部署 & 水平扩展
2 Java环境依赖
  • 运行 Elasticsearch,需安装并配置JDK
    • 设置$JAVA_ HOME
  • 各个版本对 Java的依赖
3 下载和安装启动
3.1 下载
3.2 文件目录结构
目录 配置文件 描述
bin 脚本文件,包括启动elasticsearch,安装插件。运行统计数据等
config elasticsearch.yml 集群配置文件,user, role based相关配置
JDK Java运行坏境
data path.data 数据文件
lib Java类库
logs path.log 日志文件
modules 包含所有ES模块
plugins 包含所有已安装插件
3.3 JVM 配置
3.4 服务启动
  • 启动命令
 elasticsearch-7.1.0 bin/elasticsearch



3.5 运行多实例
  1. bin/ elasticsearch - E node.name=node1 -E cluster.name=elasticsearch -E path.data=node1_data -d
  2. bin/ elasticsearch - E node.name=node1 -E cluster.name=elasticsearch -E path.data=node1_data -d
  3. bin/ elasticsearch -E node.name=node3 -E cluster.name=elasticsearch -E path.data=node3_data -d
3.6 插件安装与查看
  • 命令

    • 安装:bin/Elasticsearch-plugin install analysis-icu
    • 查看:bin/Elasticsearch-plugin list
      插件安装与查看
3.7 常用插件
  • Discovery Plugin
  • Analysis Plugin
  • Security Plugin
  • Management Plugin
  • Ingest Plugin
  • Mapper Plugin
  • Backup Plugin

https://www.elastic.co/guide/en/elasticsearch/plugins/current/intro.html

三、基本概念

1. 文档(Document)
1.1 文档描述
  • Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位

    • 日志文件中的日志项
    • 一本电影的具体信息/一张唱片的详细信息
    • MP3播放器里的一首歌/一篇PDF文档中的具体内容
  • 文档会被序列化成JSON格式,保存在Elasticsearch中

    • JSON对象由字段组成
    • 每个字段都有对应的字段类型(字符串 /数值/布尔/日期/二进制/范围类型)
  • 每个文档都有一个Unique ID

    • 你可以自己指定 ID
    • 或者通过Elasticsearch自动生成
    • 文档默认通过Unique ID Routing
1.2 文档元数据
  • 元数据,用于标注文档的相关信息
    • _index -文档所属的索引名
    • _type -文档所属的类型名
    • _id- 文档唯一ID
    • _source: 文档的原始JSON数据
    • _all: 整合所有字段内容到该字段,已被废除
    • _version: 文档的版本信息
    • _score: 相关性打分


      文档元数据
2. 索引(index)
2.1 概念
  • Index -索引是文档的容器,是一类文档的结合

    • Index体现了逻辑空间的概念:每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型
    • Shard体现了物理空间的概念:索引中的数据分散在Shard上
  • 索引的Mapping与Settings

    • Mappirg定义文档字段的类型
    • Setting定义不同的数据分布


      索引概念
2.2 索引的不同语意
  • 名词:一个Elasticsearch 集群中,可以创建很多个不同的索引
  • 动词:保存一个文档到Elasticsearch的过程也叫索引(indexing)
    • ES中,创建一个倒排索引的过程
  • 名词: 一个B树索引,一个倒排索引


    索引的不同语意
3. type
  • 在7.0之前,一个Index可以设置多个Types
  • 6.0开始,Type 已经被Deprecated。7.0 开始, 一个索引只能创建一个Type “_doc”
4. 抽象类比
  1. 在7.0之前,一个Index可以设置多个Types
  2. 目前Type 已经被Deprecated, 7.0开始,一个索引只能创建一个Type “_doc”
  3. 传统关系型数据库和Elasticsearch 的区别
    1. 0 Elasticsearch- Schemaless /相关性/高性能全文检索
    2. RDMS -事务性/ Join


      抽象类比
3. REST API
REST API
4. 分布式系统的高可用性与扩展性
  • 高可用性:
    • 服务可用性 - 允许有节点停止服务
    • 数据可用性 - 部分节点丢失,不会丢失数据
  • 扩展性
    • 请求量提升/数据的不断增长(将数据均匀分布到所有节点上)
5. Elasticsearch分布式特性
  • Elasticsearch 的分布式架构的好处

    • 存储的水平扩容
    • 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
  • Elasticsearch 的分布式架构

    • 不同的集 群通过不同的名字来区分,默认名字“elasticsearch”
    • 通过配置文件修改,或者在命令行中-E cluster.name=elasticsearch进行设定
    • 一个集群可以有一个或者多个节点
6. 节点
6.1 概念
  • 节点是一个Elasticsearch的实例

    • 本质上就是一个JAVA进程
    • 一台机器上可以运行多个Elasticsearch进程,但是生产环境一般建议一台机器上只运行一个Elasticsearch实例
  • 每一个节点都有名字,通过配置文件配置,或者启动时候-E node.name=node1指定

  • 每一个节点在启动之后,会分配一个UID,保存在data目录下

6.2 节点类型
  1. Master-eligible nodes和Master Node

    • 每个节点启动后,默认就是一个Master eligible节点

      • 可以设置node.master: false禁止
    • Master- eligible节点可以参加选主流程,成为Master节点

    • 当第一个节点启动时候,它会将自己选举成Master节点

    • 每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息

      • 集群状态(Cluster State),维护了一个集群中,必要的信息

        • 所有的节点信息
        • 所有的索引和其相关的Mapping与Setting 信息
        • 分片的路由信息
      • 任意节点都能修改信息会导致数据的不一致性

  2. Data Node & Coordinating Node

    • Data Node
      • 可以保存数据的节点,叫做Data Node。负责保存分片数据。在数据扩展上起到了至关重要的作用
    • Coordinating Node
      • 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起
      • 每个节 点默认都起到了Coordinating Node的职责
  3. 其他的节点类型

    • Hot & Warm Node

      • 不同硬件配置的 Data Node,用来实现Hot & Warm架构,降低集群部署的成本
    • Machine L earning Node

      • 负责跑机器学习的Job,用来做异常检测
    • Tribe Node

      • (5.3开始使用Cross Cluster Serarch) Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理
6.3 配置节点类型
  • 开发环境中一个节点可以承担多种角色.
  • 生产环境中,应该设置单一的角色的节点(dedicated node)
节点类型 配置参数 默认值
maste eligible node.master true
data node.data true
ingest node.ingest true
coordinating only 每个节点默认都是coordinating节点。设置其他类型全部为false,
machine learning node.ml true (需enable x-pack)
6.4 Maste Eligible Nodes & 选主过程
  • 互相Ping对方,Node id 低的会成为被选举的节点

  • 其他节点会加入集群,但是不承担Master节点的角色,一旦发现被选中的主节点丢失,就会选出新的Master节点

  • 一个集群,支持配置多个Master Eligible 节点。这些节点可以在必要时(如Mast现故障,网络故障时)参与选主流程,成为Master节点

  • 每个节点启动后, 默认就是一个Master eligible节点

    • 可以设置node.master: false禁止
  • 当集群内第一个 Master eligible 节点启动时候,它会将自己选举成Master节点

![ Maste Eligible Nodes & 选主过程](https://upload-images.jianshu.io/upload_images/18485892-3bffc0a821162fed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/720)
6.5 脑裂问题
  • Split- Brain,分布式系统的经典网络问题,当出现网络问题,一个节点和其他节点无法连接

    • Node2和Node3会重新选举Master
    • Node 1自己还是作为Master,组成一个集群,同时更新Cluster State
    • 导致2 个master,维护不同的cluster state。当网络恢复时,无法选择正确恢复
    脑裂问题
6.6 如何避免脑裂问题
  • 限定-个选举条件,设置quorum(仲裁),只有在Master eligible节点数大于quorum时,才能进行选举

    • Quorum= (master节点总数/2) + 1
    • 当3个master eligible 时,设置discovery.zen.minimum. master _nodes为2,即可避免脑裂
  • 从7.0开始,无需这个配置

    • 移除 minimum_ master. nodes参数,让Elasticsearch自 己选择可以形成仲裁的节点。
    • 典型的主 节点选举现在只需要很短的时间就可以完成。集群的伸缩变得更安全、更容易,并且可能造成丢失数据的系统配置选项更少了。
    • 节点更清楚地记录它们的状态,有助于诊断为什么它们不能加入集群或为什么无法选举出主节点
7 分片
7.1 分片(Primary Shard & Replica Shard)
  • 主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上

    • 一个分片是一个运行的L ucene的实例
    • 主分片数在索引创建时指定,后续不允许修改,除非Reindex
  • 副本,用以解决数据高可用的问题。分片是主分片的拷贝

    • 副本分片数,可以动态题调整
    • 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
    分片
7.2 分片的设定
  • 对于生产环境中分片的设定,需要提前做好容量规划
    • 分片数设置过小

      • 导致后续无法增加节 点实现水品扩展.
      • 单个分片的数据量太大,导致数据重新分配耗时
    • o分片数设置过大,7.0 开始,默认主分片设置成1,解决了over- -sharding的问题

      • 影响搜索结果的相关性打分,影响统计结果的准确性
      • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能
7.3 分片的健康状态

GET_ cluster/health

{
  "cluster_name": "elasticsearch",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 2,
  "number_of_.data_nodes": 2,
  "active_primary_.shards": 37,
  "active_shards": 70,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting__in_queue_millis": 0,
  "active_shards_percent_as_number": 100
}


  • Green - 主分片与副本都正常分配
  • Yellow - 主分片全部正常分配,有副本分片
  • Red - 有主分片未能分配
    • 例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引
7.4 文档存储在分片上
  • 文档会存储在具体的某个主分片和副本分片上:例如文档1, 会存储在PO和RO分片上
  • 文档到分片的映射算法
    • 确保文档能均匀分布在所用分片上,充分利用硬件资源,避免部分机器空闲,部分机器繁忙
    • 潜在的算法
      • 随机/ Round Robin。当查询文档1,分片数很多,需要多次查询才可能查到文档1
      • 维护文档到分 片的映射关系,当文档数据量大的时候,维护成本高
      • 实时计算,通过文档1,自动算出,需要去那个分片上获取文档

  • 文档分片路由算法
    shard = hash( routing) % number_of_primary_shards

    • Hash算法确保文档均匀分散到分片中
    • 默认的_ routing值是文档id
    • 可以自行制定routing数值, 例如用相同国家的商品,都分配到指定的shard
    • 设置Index Settings后,Primary 数,不能随意修改的根本原因
      PUT posts/. doc/100?routing=bigdata

四、文档索引

1. 正排索引和倒排索引
1.1 正排
  • 书本目录页
1.2 倒排
  • 书本最后的注释索引页

  • 文档内容做拆分

  • 统计单个文本在文档内容中出现的次数和位置

    倒排
2. 倒排索引核心组成

<u>倒排索引包含两个部分</u>

  • 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系
    • 单词词典一般比较大,可以通过B +树或哈希拉链法实现,以满足高性能的插入与查询
  • 倒排列表(Posting List)-记录了单词对应的文档结合,由倒排索引项组成
    • 倒排索引项 (Posting)
      • 文档ID
      • 词频TF-该单词在文档中出现的次数,用于相关性评分
      • 位置(Position) - 单词在文档中分词的位置。用于语句搜索(phrase query)
      • 偏移(Offset) -记录单词的开始结束位置,实现高亮显示
3. ElasticSearch的倒排索引
  • Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引

  • 可以指定对某 些字段不做索引

    • 优点:节省存储空间
    • 缺点:字段无法被搜索
  • 文档中Elasticsearch倒排索引


    倒排索引
4. 倒排索引不可变性
  • 倒排索引采用Immutable Design, -旦生成,不可更改
  • 不可变性, 带来了的好处如下:
    • 不可变性, 带来了的好处如下:
    • 一 旦读入内核的文件系统缓存,便留在哪里。只要文件系统存有足够的空间,大部分请求就会直接请求内存,不会命中磁盘,提升了很大的性能
    • 缓存容 易生成和维护/数据可以被压缩
  • 不可变更性, 带来了的挑战:如果需要让一个新的文档可以被搜索,需要重建整个索引

五、 文档操作

1. CURD介绍
1.1 概述
操作 命令
Index PUT my_index/Idoc/1 {“user"”:”mike”,“comment”:"You know, for search”}
Create PUT my_index/_create/1 {“user”:”mike' ,“comment”:"You know, for search"}
Create POST my_index/_doc {“user”:" mike”“comment":"You know, for search"}
Read GET my_ index/_doc/1
Update POST my_index/_update/1 {“doc”:{“user” :”mike".“comment”:" You know,Elasticsearch"}
Delete DEL ETE my_ index/_ _doc/1
1.2 Type
  • Type名,约定都用_doc
1.3 Create

<u>(PUT user/create/1 {"key":"value"})</u>

  • 如果ID已经存在,会失败
    • 支持自动生成文档ld和指定文档Id两种方式
      • 通过调用“ post /users/_doc'
      • 系统会自动生成document ld
    • 使用HTTP PUT user/_ create/1 创建时,URI中显示指定 _create, 此时如果该id的文档已经存在,操作失败

1.4 Get

<u>(GET user/_doc/1</u>

  • 找到文档, 返回HTTP 200

    • 0文档元信息
    • _index/_type/
    • 版本信息,同一个Id的文档,即使被删除,Version号也会不断增加
    • _source 中默认包含了文档的所有原始信息
  • 找不到文档,返回HTTP 404

1.5 Index

<u>(PUT user/_doc/1 {"key":"value"})</u>

  • 如果ID不存在,创建新的文档。否则,先删除现有的文档,再创建新的文档,版本会增加
1.6 Update

<u>(POST user/update/1 {"_doc":{"key":"new value"}})</u>

  • 文档必须已经存在,更新只会对相应字段做增量修改
  • Post方法/ Payload需要包含在“doc” 中
2. Bulk API
2.1 概述
  • 支持在一次API调用中,对不同的索引进行操作

  • 支持四种类型操作

    • Index
    • Create
    • Update
    • Delete
  • 可以再URI中指定Index,也可以在请求的Payload中进行

  • 操作中单条操作失败,并不会影响其他操作

  • 返回结果包括了每一条操作执行的结果(各操作间互不影响)

Bulk API
3. mget (批量读取)

批量操作,减少网络连接产生的开销,提供性能

  • request:
    <u>GET _mget</u>
{
      "docs": [
        {
          "_index": "user",
          "_id": 1
        },
        {
          "_index": "user",
          "_id": 2
        }
      ]
    }

  • response:
{
      "doc": [
        {
          "index": "user",
          " type": " doc",
          "id": 1,
          "version": 4,
          "_seq_no": 3,
          "primary. _term": 1,
          "found": true,
          "source": [
            {
              "key": "value",
              "keys": [
                "value",
                "value",
                "value"
              ]
            }
          ]
        },
        {
          "index": "user",
          " type": " doc",
          "id": 2,
          "version": 4,
          "_seq_no": 3,
          "primary. _term": 1,
          "found": true,
          "source": [
            {
              "key": "value",
              "keys": [
                "value",
                "value",
                "value"
              ]
            }
          ]
        }
      ]
    }

4. msearch(批量查询)

POST users/_msearch

{"query" : "match_all" : {}}
{"query" : "match_all" : {}}
{"index" : "twitter2"}
{"query" : "match_all" : {}}

5. 指定查询的索引
语法 范围
/_search 集群上所有的索引
/index1/_search index1
/indext,index2/_search index1和index2
/index*/_search 以index开头的索引
6. 常见错误返回
问题 原因
无法连接 网络故障或集群挂了
连接无法关闭 网络故障或节点出错
429 集群过于繁忙
4xx 请求体格式有错
500 集群内部错误

六、文档分词

1. Analysis与Analyzer
  • Analysis -文本分析是把全文本转换- -系列单词(term / token)的过程,也叫分词
  • Analysis 是通过Analyzer(分词器)来实现的
    • 可使 用Elasticsearch内置的分析器i或者按需定制化分析器
    • 除了在数据写入时转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析

[图片上传失败...(image-b77b26-1595398460324)]

文档分词
2. Analyzer的组成
  • 分词器是专门处理分词的组件,Analyzer 由三部分组成

    • Character Filters (针对 原始文本处理,例如去除html)
    • Tokenizer (按照规则切分为单词) /
    • Token Filter (将切分的的单词进行加工,小写,删除stopwords,增加同义词)


      Analyzer的组成
3. ElasticSearch内置分词器
  • Standard Analyzer -默认分词器,按词切分,小写处理,
  • Simple Analyzer一按照非字母切分(符 号被过滤) ,小写处理
  • Stop Analyzer一小写处理,停用词过滤(the, a, is)
  • Whitespace Analyzer -按照空格切分,不转小写
  • Keyword Analyzer - -不分词,直接将输入当作输出
  • Patter Analyzer一正则表达式,默认\W+ (非字符分隔)
  • Language一提供了30多种常见语言的分词器
  • Customer Analyzer自定义分词器
4. 分词器示列
4.1 Standard Analyzer
  • 默认分词器

  • 按词拆分

  • 小写处理

Standard Analyzer
4.2 Simple Analyzer
  • 按照非字母切分,非字母的都被去除

  • 小写处理

Simple Analyzer
4.3 Whitepace Analyzer
  • 按空格拆分
Whitepace Analyzer
4.4 Stop Analyzer
  • 相比与Simple Analyzer

  • 多了Stop Analyzer

    • 会把the、a、is等修饰词语去掉
Stop Analyzer
4.4 Pattern Analyzer
  • 通过正则表达式进行分词

  • 默认是\W+,非字符的符号进行分割

Pattern Analyzer

七、配置属性

1. index属性
属性 缺省值 描述
cluster.name federated_cluster Elasticsearch 集群名称。使用集群可将单独 Process Federation Server 绑定到单个分布式系统中。参与集群的所有服务器都必须具有相同的集群名称。
index.number_of_shards 1 设置默认索引分片个数,默认为5片(7.x以后默认1个分片
index.number_of_replicas 1 设置默认索引副本个数,默认为1个副本
indices.recovery.max_size_per_sec 0 设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制
indices.recovery.concurrent_streams 5 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5
discovery.zen.minimum_master_nodes 1 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。
discovery.zen.minimum_master_nodes 1 指示某个集群定额所需的 Process Federation Server 的数量。缺省值为 1 表示单服务器环境。对于生产环境,请将该值设置为组成定额所需的 Process Federation Server 的数量。例如,如果在集群中总计有三个 Process Federation Server,请将该值设置为“2”,如果在集群中总计有五个 Process Federation Server,请将该值设置为“3”。有关更多信息,请参阅 Elasticsearch 文档。
discovery.zen.ping.multicast.enabled false 通过发送节点所接收和响应的一个或多个多点广播请求来提供对其他 Elasticsearch 服务节点的多点广播 ping 发现功能。有关更多信息,请参阅 Elasticsearch 文档
discovery.zen.ping.unicasts.hosts localhost 提供其他 Elasticsearch 服务节点的单点广播发现功能。配置集群中基于主机 TCP 端口的其他 Elasticsearch 服务的逗号分隔列表。
discovery.zen.ping.timeout 3s Elastic 搜索节点等待加入 Elasticsearch 集群的时间。
2. Mapping支持的属性

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-params.html

属性 默认 描述
enabled true 仅存储、不做搜索和聚合分析
index true 是否构建倒排索引(即是否分词,设置false,字段将不会被索引)
index_option 分词字段默认是positions,其他默认时doc 存储倒排索引的哪些信息(1. docs:索引文档号;2:freqs:文档号+词频;3. positions:文档号+词频+位置,通常用来距离查询);4. offsets:文档号+词频+位置+偏移量,通常被使用在高亮字段
norms false 是否归一化相关参数、如果字段仅用于过滤和聚合分析、可关闭分词字段默认配置,不分词字段:默认{“enable”: false},存储长度因子和索引时boost,建议对需要参加评分字段使用,会额外增加内存消耗
doc_value true 是否开启doc_value,用户聚合和排序分析对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存
fielddata "fielddata": {"format": "disabled"} 是否为text类型启动fielddata,实现排序和聚合分析针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value
dynamic true 控制mapping的自动更新
analyzer standard analyzer 指定分词器
fields 可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
ignore_above "ignore_above": 100 超过100个字符的文本,将会被忽略,不被索引
null_value 设置一些缺失字段的初始化,只有string可以使用,分词字段的null值也会被分词("null_value": "NULL")
Mapping支持的属性
3 字段类型
31 字段类型概述
一级分类 二级分类 具体类型
核心类型 字符串类型 string, text, keyword
h 整数类型 integer, long, short, byte
h 浮点类型 double, float,half float,scaled, float
h 逻辑类型 boolean
h 日期类型 date
h 范围类型 range
h 二进制类型 binary
复合类型 数组类型 array
f 对象类型 object
f 嵌套类型 nested
地理类型 地理坐标类型 geo_point
d 地理地图 geo_shape
特殊类型 IP类型 ip
t 范围类型 completion
t 令牌计数类型 token_count
t 附件类型 attachment
t 抽取类型 percolator
3.2 字符串类型
  • 字符串类型
    • string类型: 在ElasticSearch 旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代
    • keyword类型:适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到;
    • text 类型:当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。

八、SDK应用

1. SDK集成
1.1 Maven依赖
       <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
1.2 SpringBoot依赖
  • SpringBoot配置文件中需要更新默认版本号
    <properties>
        <elasticsearch.version>7.6.2</elasticsearch.version>
    </properties>
1.3 初始化客户端
@Beanpublic RestHighLevelClient restHighLevelClient() {
    RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
            RestClient.builder(
                    new HttpHost("localhost", 9200, "http"),
                    new HttpHost("localhost", 9201, "http")));
    return restHighLevelClient;
}

2. 常用API
  • indices
  • index
  • delete
  • search
  • update
  • bulk
2.1 es索引常用API

<u>RestHighLevelClient.indices()</u>

方法 参数 描述
create CreateIndexRequest Creates an index using the Create Index API.
createAsync CreateIndexRequest Asynchronously creates an index using the Create Index API.
delete DeleteIndexRequest Deletes an index using the Delete Index API.
deleteAsync DeleteIndexRequest Asynchronously deletes an index using the Delete Index API.
open OpenIndexRequest Opens an index using the Open Index API.
openAsync OpenIndexRequest Asynchronously opens an index using the Open Index API.
close CloseIndexRequest Closes an index using the Close Index API.
closeAsync CloseIndexRequest Asynchronously closes an index using the Close Index API.
get GetIndexRequest Retrieve information about one or more indexes
getAsync GetIndexRequest Retrieve information about one or more indexes
putMapping PutMappingRequest Updates the mappings on an index using the Put Mapping API.
putMappingAsync PutMappingRequest Asynchronously updates the mappings on an index using the Put Mapping API.
getMapping GetMappingsRequest Retrieves the mappings on an index or indices using the Get Mapping API.
getMappingAsync GetMappingsRequest Asynchronously retrieves the mappings on an index on indices using the Get Mapping API.
getFieldMapping GetFieldMappingsRequest Retrieves the field mappings on an index or indices using the Get Field Mapping API.
getFieldMappingAsync GetFieldMappingsRequest Asynchronously retrieves the field mappings on an index on indices using the Get Field Mapping API.

<u>RestHighLevelClient.method()</u>

方法 参数 描述
reindex ReindexRequest Executes a reindex request.
reindexAsync ReindexRequest Asynchronously executes a reindex request.
2.2 文档检索

<u>RestHighLevelClient.get()</u>

方法 参数 描述
get GetRequest Retrieves a document by id using the Get API.

<u>RestHighLevelClient.mget()</u>

方法 参数 描述
mget MultiGetRequest Retrieves multiple documents by id using the Multi Get API.

<u>RestHighLevelClient.method()</u>

方法 参数 描述
get GetRequest Retrieves a document by id using the Get API.
mget MultiGetRequest Retrieves multiple documents by id using the Multi Get API.
2.3 文档创建

<u>RestHighLevelClient.method()</u>

方法 参数 描述
index IndexRequest Index a document using the Index API.
indexAsync MultiGetRequest Asynchronously index a document using the Index API.
2.4 文档删除

<u>RestHighLevelClient.method()</u>

方法 参数 描述
delete DeleteRequest Deletes a document by id using the Delete API.
deleteAsync DeleteRequest Asynchronously deletes a document by id using the Delete API.
deleteByQuery DeleteByQueryRequest Executes a delete by query request.
deleteByQueryAsync DeleteByQueryRequest Asynchronously executes a delete by query request.
2.5 文档更新

<u>RestHighLevelClient.method()</u>

方法 参数 描述
update UpdateRequest Updates a document using the Update API.
updateAsync UpdateRequest Asynchronously updates a document using the Update API.
updateByQuery UpdateByQueryRequest Executes a update by query request.
updateByQueryAsync UpdateByQueryRequest Asynchronously executes an update by query request.
2.6 批量操作

<u>RestHighLevelClient.bulk()</u>

方法 参数 描述
bulk BulkRequest Executes a bulk request using the Bulk API.
bulkAsync BulkRequest Asynchronously executes a bulk request using the Bulk API.
2.7 常用查询条件
查询类型 描述
termQuery 精确查询
termsQuery 精确查询(多值)
rangeQuery 范围查询
wildcardQuery 模糊匹配查询
queryStringQuery 多字段查询,指定运算类型类型查询,分词查询
matchAllQuery 查询所有
matchQuery 分词查询
matchPhraseQuery 短语匹配
2.8 基于全文的查询
  • 基于全文本的查找

    • Match Query / Match Phrase Query / Query String Query
  • 特点

    • 索引和搜索时都会进行分词,查询字符串先传递到-个合适的分词器,然后生成-个供查询的词项列表并。并为每个文档生成一个算分。 -例如查“Matrix reloaded",会查到包括Matrix或者reload的所有结果。
  • 查询时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合

2.9 boolean查询
  • 一个bool查询,是-个或者多个查询子句的组合

    • 总共包括4 种子句。其中2种会影响算分,2种不影响算分
  • 相关性并不只是全文本检索的专利。 也适用于yes Ino的子句,匹配的子句越多,相关性评越高。如果多条查询子句被合并为一条复合查询语句,比如bool查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。

bool 描述
must I必须匹配。贡献算分
should 选择性匹配。贡献算分
must not Filter Contex查询字句,必须不能匹配t
filter Filter Context必须匹配,但是不贡献算分
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342