ElasticSearch实战基础教程(从概念到机制到深入透析)

1.ElasticSearch基础概念

1.1 文档(Doucument)

1.ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位
	·日志文件中的日志项
	·一本电影的具体信息/一张唱片的详细信息
	·MP3播放器里面的一首歌/一遍PDF文档中的具体内容
2.文档是会被序列化成JSON格式,报错在ElasticSearch中
	·JSON对象由字段组成
	·每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)
3.每个文档都有一个Unique ID
	·你可以自己指定ID
	·或者通过ElasticSearch自动生成

1.2JSON文档

一篇文档包含了一系列的字段,类似数据库表中一条记录
JSON文档格式灵活不需要预先定义格式
	·字段的类型可以指定或者通过ElasticSearch自动推算
	·支持数组/支持嵌套

ElasticSearch实战基础教程(从概念到机制到深入透析)_第1张图片

1.3 文档的元数据

{
        "_index": "my_test_index",
        "_type": "test_idnex",
        "_id": "AXcpGrIeEQcMCfQJ7Gc5",
        "_score": 1,
        "_source": {
          "testId": "4",
          "testName": "zhaoliu"
        }
 }     

元数据,用于标准文档的相关信息

  • _index 文档所属的索引名
  • _type 文档所属的类型名
  • _id 文档的唯一id
  • _source 文档原始的JSON数据
  • _all 整合所有字段的内容到该字段,已被作废
  • _version 文档的版本信息
  • _score 相关性打分

1.4 索引

{
  "my_test_index": {
    "settings": {
      "index": {
        "search": {
          "slowlog": {
            "level": "info",
            "threshold": {
              "fetch": {
                "warn": "200ms",
                "trace": "50ms",
                "debug": "80ms",
                "info": "100ms"
              },
              "query": {
                "warn": "200ms",
                "trace": "50ms",
                "debug": "80ms",
                "info": "100ms"
              }
            }
          }
        },
        "indexing": {
          "slowlog": {
            "level": "info",
            "threshold": {
              "index": {
                "warn": "200ms",
                "trace": "20ms",
                "debug": "50ms",
                "info": "100ms"
              }
            },
            "source": "1000"
          }
        },
        "number_of_shards": "5",
        "provided_name": "my_test_index",
        "creation_date": "1611301841428",
        "unassigned": {
          "node_left": {
            "delayed_timeout": "5m"
          }
        },
        "number_of_replicas": "1",
        "uuid": "e5B65ySmQ-GE8Tj9gUHIPw",
        "version": {
          "created": "5050399"
        }
      }
    }
  }
}
  • INDEX 索引是文档的容器是一类文档的结合
    • INDEX 体现了逻辑空间的概念:每个索引都有自己的mapping定义用于定义包含文档的字段名和字段类型
    • Shard 体现了物理空间的概念 索引中的数据分散在Shard上
  • 索引的Mapping与Settings
    • Mapping 定义文档字段的类型
    • setting 定义不同的数据分布

1.5 Type

ElasticSearch实战基础教程(从概念到机制到深入透析)_第2张图片

  • 在7.0之前,一个Index可以设置多个Types
  • 6.0开始,Type已经被Deprecated(不推荐使用)。从7.0开始一个索引只能创建一个Type - > “_doc”

1.6 抽象与类比

RDBMS ElasticSearch
Table Index(Type)
Row Document
Column Filed
Schema Mapping
SQL DSL
  • 在7.0之前 一个Index 可以设置多个Types
  • 目前Type 已经被 Deprecated(不推荐使用) ,7.0开始一个索引只能创建一个Type - > “_doc”
  • 传统关系型数据库和ElasticSearch 的区别
    – ElasticSearch - Schemaless /相关性/高性能全文检索
    – RDMS - 事务性/Join

2.节点、集群、分片及副本

2.1 分布式特性

  • ElasticSearch 的分布式架构的好处
    - 存储的水平扩容
    - 提高系统的可用性,部分节点停止服务整个集群的服务不受影响
  • ElasticSearch的分布式架构
    • 不同集群通过不同的名字来区分 默认为 “elasticsearch”
    • 通过配置文件修改,或者在命令行中 -E cluster.name=geektime 进行设定
    • 一个集群可以有一个或者多个节点

2.2 节点

  • 节点是一个ElasticSearch 的实例
    – 本质上就一个Java进程
    – 一台机器上可以运行多个ElasticSearch进程,但是生产环境一般建议一台机器只运行一个ElasticSearch 实例
  • 每一个节点都有名字 通过配置文件配置或者启动的时候 -E node.name=node1来指定
  • 每一个接在在启动之后会分配一个UID,保存在data目录下

2.2.1 Master-eligible nodes(合格节点) 和Master Node(主)

  • 每个节点启动后 默认就是一个 Master eligible节点
    • 可以设置node.master:false 禁止
  • Master-eligible可以参加选主流程,成为Master节点
  • 当第一个节点启动的时候,它会将自己选举成Master节点
  • 每个节点都保存了集群的状态,只有Master节点才能修改集群的状态信息
    • 集群状态(Cluster State)维护了一个集群中的必要信息
      • 所有节点的信息
      • 所有的索引和其相关的Mapping与Setting信息
      • 分片的路由信息
    • 任意节点都能修改信息会导致数据的不一致性

2.2.2 Data Node & Coordinating Node

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

2.2.3 其他节点

  • Hot & Warm Node (参考链接Hot & Warm Node)
    – 不同硬件配置的Data Node,用来实现 Hot & Warm架构,降低集群部署的成本
  • Machine Learning Node(机器学习节点)
    – 负责跑 机器学的Job 用来做异常检测
  • Tribe Node (协调节点 充当跨多集群联合客户端)
    – (5.3 开始使用Cross Cluster Search) Tribe Node 连接到不同的ElasticSearch集群,并且支持将这些集群当成一个单独的集群

2.2.4 配置节点类型

  • 开发环境中一个节点可以承担多种角色
  • 生产环境中,应该设置单一的角色的节点(dedicate 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)

2.3 分片(Primary Shard & Replica Shard)

  • 主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分不到集群内的所有节点之上
    • 一个分片是一个运行的Lucene的实例
    • 主分片数在索引创建时指定,后续不允许修改,除非Reindex
  • 副本,用以解决数据高可用的问题。分片是主分片的拷贝
    • 副本分片数,可以动态调整
    • 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
  • 一个三节点的集群中,blogs索引的分配分布情况
    ElasticSearch实战基础教程(从概念到机制到深入透析)_第3张图片

2.3.1 分片的设定

  • 对于生产环境中分配的设定,需要提前做好容量规划
    • 分片数设置过小
      • 导致后续无法增加节点实现水平扩展
      • 单个分片的数据量大,导致数据重新分配耗时
    • 分片数设置过大,7.0卡死,默认主分片设置成1,解决了over-sharding(shard也是一种资源,shard过多会影响集群的稳定性。因为shard过多,元信息会变多,这些元信息会占用堆内存。shard过多也会影响读写性能,因为每个读写请求都需要一个线程。所以如果index没有很大的数据量,不需要设置很多shard。)的问题
      • 影响搜索结果的相关性打分,影响统计结果的准确性
      • 当个节点上过多的分片,会导致资源的浪费同时也会影响性能

2.4 查看集群的健康状态

GET _cluster/health
{
     
  "cluster_name": "es-cn-zz11rb9fv000fj1pe",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 6,
  "number_of_data_nodes": 3,
  "active_primary_shards": 766,
  "active_shards": 1507,
  "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
}
GET _cat/nodes
172.17.25.39 45 91 3 0.23 0.08 0.06 di - 3Ja7gZv
172.17.25.53 55 79 1 0.00 0.01 0.05 mi * H1guebi
172.17.25.52 22 78 0 0.01 0.02 0.05 mi - rdjzfmG
172.17.25.51 24 78 0 0.00 0.01 0.05 mi - uaU255o
172.17.25.38 54 91 2 0.23 0.26 0.16 di - wQwmOos
172.17.25.40 65 89 1 0.01 0.17 0.26 di - 4mZ8XK7

GET _cat/shard
companyinfo                     4 r STARTED 31408061  38.5gb 172.17.25.38 wQwmOos
companyinfo                     4 p STARTED 31408061  40.2gb 172.17.25.39 3Ja7gZv
companyinfo                     1 p STARTED 31412834  43.2gb 172.17.25.38 wQwmOos
companyinfo                     1 r STARTED 31412834  41.7gb 172.17.25.39 3Ja7gZv
companyinfo                     3 r STARTED 31407535  37.6gb 172.17.25.40 4mZ8XK7
companyinfo                     3 p STARTED 31407535  36.8gb 172.17.25.39 3Ja7gZv
companyinfo                     2 r STARTED 31412927  41.8gb 172.17.25.40 4mZ8XK7
companyinfo                     2 p STARTED 31412927  41.2gb 172.17.25.39 3Ja7gZv
companyinfo                     0 p STARTED 31400572  40.4gb 172.17.25.40 4mZ8XK7
companyinfo                     0 r STARTED 31400572  43.1gb 172.17.25.38 wQwmOos
  • Green 主分片和副本都很正常
  • Yellow 主分片全部正常分配,有副本分片未能正常分配
  • Red 有主分片未能分配
    • 例如当服务器的磁盘容量超过85%时 去创建了一个新的索引

3.文档的CRUD & 批量操作

3.1 文档的CRUD

  • Type名 约定都用_doc
  • Create 如果ID已经存在会失败
  • Index 如果ID不存在创建新的文档否则先删除现有的文档再创建新的文档 版本会增加
  • Update 文档必须已经存在更新只会对响应字段做增量修改

3.1.1 Index

PUT my_test_index/_doc/1
{
     
	"user":"mike",
	"comment":"You know,for search"
}
  • Index和Create 不一样的地方:如果文档不存在,就索引新的文档。否则现有文档会被删除,新的文档被索引。版本信息+1

3.1.2 Create

PUT my_test_index/_create/1
{
     
	"user":"mike",
	"comment":"You know,for search"
}
POST my_test_index/_doc (不指定ID 自动生成)
{
     
	"user":"mike",
	"comment":"You know,for search"
}
  • 支持自动生成文档ID 和指定文档ID的两种类型
  • 通过调用"post /my_test_index/_doc"
    • 系统会自动生成document id

3.1.3 Read

GET my_test_indx/_doc/_1


{
     
  "took": 1,
  "timed_out": false,
  "_shards": {
     
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
     
    "total": 1,
    "max_score": 1,
    "hits": [
      {
     
        "_index": "my_store",
        "_type": "products",
        "_id": "5",
        "_score": 1,
        "_source": {
     
          "price": 10,
          "productName": "ZHANGSAN",
          "productID": "XHDK-A-1293-#fJ3"
        }
      }
    ]
  }
  • 找到文档,返回HTTP 200
    • 文档元信息
      • _index/_type/
      • 版本信息,同一个ID的文档即使被删除,version号也会不断的增加
      • _source 中默认包含了文档的所有原始数据
  • 找不到文档 返回HTTP 404

3.1.4 Update

POST my_test_index/_update/1
{
     
	"doc":{
     
		"user":"mike",
		"comment":"You know,ElasticSearch"
	}
}
  • Update方法不会删除原来的文档,而是实现真正的数据更新
  • Post 方法/Payload 需要包含在 “doc” 中

3.1.4 Delete

DELETE my_test_index/_doc/1

3.2 Bulk API

ElasticSearch实战基础教程(从概念到机制到深入透析)_第4张图片

  • 支持在一次API调用中,对不同的索引进行操作

  • 支持四种类型操作

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

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

  • 返回结果包括了每一条操作执行的结果

3.3 批量读取 -mget

批量操作可以减少网络连接所产生的开销 提高性能
ElasticSearch实战基础教程(从概念到机制到深入透析)_第5张图片
ElasticSearch实战基础教程(从概念到机制到深入透析)_第6张图片

GET /_mget
{
     
	"docs": [{
     
			"_index": "my_store",
			"_id": 1
		},
		{
     
			"_index": "companyinfo",
			"_id": "cd5b8daadc31482e84715da912a604f4"
		}
	]
}



{
     
  "docs": [
    {
     
      "_index": "my_store",
      "_type": "products",
      "_id": "1",
      "_version": 4,
      "found": true,
      "_source": {
     
        "price": 12,
        "productID": "XHDK-A-1293-#fJ3"
      }
    },
    {
     
      "_index": "companyinfo",
      "_type": "companyinfo",
      "_id": "cd5b8daadc31482e84715da912a604f4",
      "_version": 1,
      "found": true,
      "_source": {
     
        "entName": "广西金朋豪友投资有限公司",
        "orgLogo": "",
        "regCapital": "500万元人民币",
        "city": "广西壮族自治区",
        "regDate": "2017-05-17",
        "industry": "商务服务业",
        "taxpayerIdNo": "91450800MA5L585X6F",
        "creditCode": "91450800MA5L585X6F",
        "registrationAuthority": "贵港市市场监督管理局",
        "staffSize": "",
        "orgCode": "MA5L585X-6",
        "enterpriseStatus": "存续(在营、开业、在册)",
        "id": "cd5b8daadc31482e84715da912a604f4",
        "businessRegCode": "450800000151505",
        "email": "",
        "introduction": "",
        "regCapitalNumber": 500,
        "website": "",
        "address": "贵港市解放北路龙圣新村小区(四小区213号)一楼",
        "town": "",
        "bossId": "4b12e1b8d1ef11-p-4b12e276d1ef1",
        "corporation": "蒙雪",
        "businessScope": "对文化产业、旅游业、旅游商品的投资;对建筑业的投资;企业形象策划,市场营销策划,赛事活动策划,舞台造型策划,婚礼庆典活动策划;展览展示服务,会务服务,礼仪服务,摄影服务;网络信息技术的开发、咨询、转让服务;影视策划咨询,企业管理咨询,投资信息咨询(以上项目除国家有专项规定外);电视节目制作服务(具体项目以审批部门批准为准);动漫设计;出版物的零售(具体项目以审批部门批准为准),室内外装饰装修工程,建筑工程设计,市政工程,景观工程设计(以上项目凭资质证经营);餐饮服务(具体项目以审批部门批准为准);设计、制作、代理、发布国内各类广告;演出经纪(具体项目以审批部门批准的为准);政府采购、招投标代理、工程咨询、土地评估、房地产评估、资产评估、房地产评估审计、工程预结算。",
        "businessTerm": "长期",
        "contributedcapital": "",
        "checkDate": "2017-05-17",
        "enterpriseType": "有限责任公司(自然人独资)",
        "orgNameEn": "",
        "taxpayerQualification": "",
        "telphone": "",
        "district": "",
        "sameEnterprise": "<关联企业3>",
        "oldOrgName": "",
        "readAddress": "贵港市解放北路龙圣新村小区(四小区213号)一楼",
        "contributors": ""
      }
    }
  ]
}

3.4 批量查询 -msearch

ElasticSearch实战基础教程(从概念到机制到深入透析)_第7张图片

3.5常见错误返回

问题 原因
无法连接 网络故障或集群故障
连接无法关闭 网络故障或节点出错
429 集群过于繁忙
4XX 请求体格式有误
500 集群内部错误

4.倒排索引

4.1 正排索引和倒排索引

ElasticSearch实战基础教程(从概念到机制到深入透析)_第8张图片

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

ElasticSearch实战基础教程(从概念到机制到深入透析)_第9张图片

4.2 ElasticSearch的倒排索引

  • ElasticSearch的JSON文档中的每个字段都有自己的倒排索引
  • 可以指定对某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

5.分词器

5.1 Alalysis 与 Analyzer

  • Alalysis 文本分析是把全文本转换一系列单词(term/token)的过程,也叫做分词
  • Alalysis 是通过Analyzer来实现的
    • 可使用ElasticSearch内置的分析器,或者采用定制化分析器
  • 除了在数据写入时转换词条,匹配Query语句的时候也需要用相同的分析器对语句进行分析
    ElasticSearch实战基础教程(从概念到机制到深入透析)_第10张图片

5.2 Analyzer的组成

  • 分词器是专门处理分词的组件,Analyzer由三部分组成
    -Character Filters(针对原始文本处理,例如出去html)/Tokenizer(按照规则切分单词)/Token Filter(将切分的单词进行加工,小写,删除stopwords,增加同义词)
    ElasticSearch实战基础教程(从概念到机制到深入透析)_第11张图片

5.3 Elasticsearch的内置分词器

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

你可能感兴趣的:(ElasticSearch,elasticsearch,分布式)