ElasticSearch 7.4.0 入门学习笔记


 

一、核心概念

  1. 索引

    存储数据得地方,可理解为关系数据库中得数据库概念

  2. 映射

    mapping定义了每个字段得类型,字段所使用得分词器等。相当于关系型数据库中得表结构

  3. 文档

    ES中得最小数据单元,常以 json 格式显示。一个文档相当于关系数据库中得一行数据

  4. 倒排索引

    一个倒排索引由文档中所有不重复得列表构成,对于其中每个词,对应一个包含它得文档id列表

    数据如下表:

    文档id数据
    1 北京
    2 上海
    3 广州
    4 上海
    5 北京

    倒排索引:

    数据文档id
    北京 1,5
    上海 2,4
    广州 3

二、安装

1、ES 安装

安装linux版本参考视频

2、ES-head插件安装

谷歌head插件教程

3、Kibana 安装

安装Kibana参考视频

4、ik 中文分词器安装

  1. 下载地址

    https://github.com/medcl/elasticsearch-analysis-ik/releases

    选择版本与 ES 一致的 ik 分词器

  2. 安装

    在ES安装目录/plugins 下创建文件夹 ik ,上传安装包解压

    mkdir ik #创建ik文件夹

    unzip elasticsearch-analysis-ik-7.4.0.zip #解压压缩包,没有unzip命令的自行百度

  3. 上传自定义的词到字典中

    在$ES/plugins/config目录下创建 dic 文件,输入自定义字典

    image-20220219160633935

    然后 vim IKAnalyzer.config.xml (打开此文件),下图红框位置输入自定义字典名称。

    image-20220219160815855

  4. 分类

    • ik

 

三、使用 kibana,ES-head操作 ES

1、操作kibinna

打开 Kibana 之前需要打开 ES,ES打开方式,进入$ES/bin 目录,输入 ./elasticsearch 命令,以下就表示ES 打开成功,此窗口不能关闭,否则ES程序会被关闭,如需操作,打开一个窗口即可

image-20220219161543382

进入$kibana/bin 目录,输入 ./kibana 命令,窗口不关闭保留

image-20220219162112663

进入 web 页面,选择 扳手 图标进入 kibana

http://locahost:5601/

image-20220219162856061

 

2、操作 ES-head 插件

打开谷歌浏览器,选择扩展程序插件

image-20220219163037368

输入本地 ES 地址(端口常为 9200), head 插件常用于索引概览查询,以及数据浏览,至于数据查询常在 kibana 上完成

image-20220219163336364

四、Rest 命令

1、字段类型

字符串类型

  • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。

  • text:会分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储

数值类型

  • long、Integer、short、byte、double、float、half floatscaled float

日期类型

  • date

布尔类型

  • boolean

二进制类型

  • binary

2、创建索引

类似于建库(建立索引和字段对应类型),也可看做规则的建立

PUT test 
{
 "mappings": {
   "properties": {
     "name":{
       "type": "text",
       "analyzer": "ik_smart"
    },
     "age":{
       "type": "integer"
    },
     "address":{
       "type":"keyword"
    }
  }
}
}

image-20220220151604293

3、获取索引信息

GET test

image-20220220152143944

4、删除索引

DELETE test

5、插入数据

插入数据可指定文档id,也可不指定,自动生成文档 id。若不指定 :PUT test/_doc {}

PUT test/_doc/1
{
 "name":"刘青屿",
 "age":24,
 "address":"中国北京天安门"
}

image-20220220152857715

6、更新数据

覆盖数据

如若更新文档某一字段的数据,若不想其他字段数据丢失,则需将其他字段的数据保留

PUT test/_doc/1
{
 "name":"liuqingyu",
 "age":24,
 "address":"中国北京天安门"
}

更新数据

若只需要更新某一字段的数据,对其操作即可,建议使用此种方法

POST test/_doc/1/_update
{
 "doc":{
   "name":"刘青屿"
}
}

image-20220220155313078

7、查询

数据样例: image-20220220160554497

7.1、查询匹配

  • match:全文查询时会分析查询条件,先将查询条件进行分词,然后查询,求并集

  • _source:过滤字段

  • sort:排序

  • from,size 分页

GET test/_search
{
 "query": {
   "match": {
     "name": "宝贝"
  }
},
 "_source":["name","age"],
 "sort": [
  {
     "age": {
       "order": "desc"
    }
  }
],
 "from": 0,
 "size": 2
}

image-20220220163138369

此处思考查询为什么数据样例中的 “大宝贝”数据为什么未被检索出来,按理说 match 对查询词条 “宝贝” 先进行分词查询,还会是 “宝贝”,因为在创建 mapping 时指定了字段类型的分词器是 ik 分词器,数据 “大宝贝” 应该会被分成 “大”,“宝贝”,此处查询未被查询出来分析得出 “大宝贝” 未被分词。具体原因是在前期将 “大宝贝” 配置到自己的字典中了。

7.2、多条件查询(bool)

  • must:相当于 and

  • should:相当于 or

  • must not:相当于 not (..... and ......)

  • filter:过滤

GET test/_search
{
 "query": {
   "bool": {
     "must": [
      {
         "match": {
           "name": "宝贝"
        }
      }
    ],
     "filter": {
       "range": {
         "age": {
           "gte": 22,
           "lte": 25
        }
      }
    }
  }
}
}

image-20220220165638443

7.3、匹配数组

  • 貌似不能与其它字段一起使用

  • 可以多关键字查(空格隔开)— 匹配字段也是符合的

  • match 会使用分词器解析(先分析文档,然后进行查询)

  • 搜词

// 匹配数组 貌似不能与其它字段一起使用
// 可以多关键字查(空格隔开)
// match 会使用分词器解析(先分析文档,然后进行查询)
GET test/_search
{
"query": {
  "match": {
    "shuzu": "热爱 追" //会被分成 热 爱 追 查询
  }
}
}

image-20220220170918460

7.4、精确匹配

  • term 直接通过 倒排索引 指定词条查询

  • 适合查询 number、date、keyword ,不适合text

GET test/_search
{
 "query": {
   "term": {
     "address": {
       "value": "大" //查询条件应该是完成词条 "大千世界"
    }
  }
}
}

image-20220220171333886

match 和 term 的区别:

https://www.jianshu.com/p/d5583dff4157

7.5 高亮查询

GET test/_search
{
 "query": {
   "match": {
     "name":"宝贝"
  }
}
,
 "highlight": {
   "pre_tags": "

",
   "post_tags": "

",
   "fields": {
     "name": {}
  }
}
}

image-20220220172737992

五、集群

5.1、相关观念

  • 集群:多个人做一样的事,分担请求

  • 分布式:多个人做不一样的事,分担存储和计算

  • 索引:可理解为关系数据库中的database概念

  • 分片(shard):索引呗拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引可以拆分到不同的节点上

  • 副本分片:每个主分片有一个或多个副本,数据和主分片一样

5.2、搭建集群

参考视频

5.3、分片配置

  • 在创建索引时,如果不指定分片配置,则默认主分片是1,副本分片也为1

    image-20220220173619721

  • 分片与自平衡:当节点挂掉后,挂掉的节点分片会自平衡到其他节点中

  • 分片数量一旦确定好,不能修改

  • 索引分片推荐配置方案:

    • 每个分片推荐大小10-30G

    • 分片数量推荐=节点数量*1~3倍

    • 例如有1000GB数据(包含副本),建议分配,1000/25=40个分片,40/2=20个节点

5.4、路由原理

  • 文档存入对应的分片,ES计算分片编号的过程,称为路由。

  • 有路由算法可知文档存在哪个分片中去哪查询 shard_index=hash(id)%主分片数量

image-20220220174224613

5.5、脑裂

image-20220220174338538

image-20220220174426915