Elasticsearch 之入门使用

1. 核心概念

  • 索引(index)

    类似的数据放在一个索引,非类似的数据放在不同索引,一个索引也可以理解成一个关系型数据库。

  • 类型(type)

    代表document属于index中的那个类别(type),也有一种说法:一种type就像是数据库的表。

    如:dept表,user表

    ES每个版本之间区别很大:

    ES 5.x 中一个index可以有多种type。

    ES 6.x 中一个index只能有一种type。

    ES 7.x以后 要逐渐移除type这个概念。

  • 映射(mapping)

    mapping 定义了每个字段的类型等信息。相当于关系型数据库中的表结构。

    常用数据类型:text、keyword、number、array、range、boolean、date、geo_point、ip、nested、object

    类型介绍:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#_multi_fields_2

    关系型数据库(如MySQL) 非关系型数据库(Elasticsearch)
    数据库 Database 索引 Index
    表 Table 索引 Index 类型(原为Type)
    数据行 Row 文档 Document
    数据列 Column 字段 Field
    约束 Schema 映射 Mapping

2. 索引操作

2.1 创建索引

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

语法:

PUT /索引名称
{
    "settings": {
        "属性名": "属性值"
    }
}

settings:就是索引库设置,其中可以定义索引库的各种属性 比如分片数 副本数等,目前我们可以不设置,都走默认

示例:

PUT /demo-index
image-20210708094157472.png

2.2 判断索引是否存在

语法:

HEAD /索引名称      

示例:

HEAD /demo-index
image-20210708094426236.png

2.3 查看索引

get 请求可以帮我们查看索引的相关属性信息。

2.3.1 查看单个索引

语法:

GET /索引名称

示例:

GET /demo-index
image-20210708094640520.png
2.3.2 批量查询索引

语法:

GET /索引名称1,索引名称2,索引名称3,...

示例:

GET /demo-index,demo-index1
image-20210708095432778.png
2.3.3 查看所有索引

语法:

方式一

GET _all
image-20210708095703697.png

方式二:

GET /_cat/indices?v
image-20210708095716199.png

绿色:索引的所有分片都正常分配。

黄色:至少有一个副本没有得到正确的分配。

红色:至少有一个主分片没有得到正确的分配。

2.3.4 打开索引

语法:

POST /索引名称/_open
image-20210708100051877.png
2.3.5 关闭索引

语法:

POST /索引名称/_close
image-20210708100125032.png
2.3.6 删除索引

语法:

DELETE /索引名称1,索引名称2,索引名称3...

示例:

DELETE /demo-index1
image-20210708100201030.png

再次查看,返回索引不存在

image-20210708100254168.png

3. 映射操作

索引创建之后,等于有了关系型数据库中的database。Elasticsearch7.x取消了索引type类型的设置,不允许指定类型,默认为_doc,但字段仍然是有的,我们需要设置字段的约束信息,叫做字段映射(mapping)

字段的约束包括但不限于:

  • 字段的数据类型
  • 是否要存储
  • 是否要索引
  • 分词器

3.1 创建映射字段

语法:

PUT /索引库名/_mapping
{
    "properties": {
        "字段名": {
            "type": "类型",
            "index": true,
            "store": true,
            "analyzer": "分词器"
        }
    }
}

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

字段名:任意填写,下面指定许多属性,例如:

  • type:类型

    可以是text、long、short、date、integer、object等

  • index:是否索引,默认为true

  • store:是否存储,默认为false

  • analyzer:指定分词器

示例:

PUT /demo-index/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "job": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "payment": {
      "type": "float"
    }
  }
}
image-20210708103504122.png

上述案例中,就是给 demo-index 这个索引库设置了3个字段

  • name:企业名称
  • job:岗位
  • payment:薪资

3.2 映射属性详解

3.2.1 type

Elasticsearch中支持的数据类型非常丰富:

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/mapping-types.html

image-20210708103751027.png
  • String 类型

    • text

      可分词,不可参与聚合

    • keword

      不可分词,数据会作为完整字段进行匹配,可以参与聚合

  • Numeric

    • 基本数据类型

      long、interger、short、byte、double、flfloat、half_flfloat

    • 浮点数的高精度类型

      scaled_flfloat

      需要指定一个精度因子,比如10或100。Elasticsearch 会把真实值乘以这个因子后存储,取出时再还原。

  • Date

    elasticsearch 可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

  • Array

    • 进行匹配时,任意一个元素 满足,都认为满足
    • 排序时,如果升序则用数组中最小值来排序,如果降序则用数组中最大值来排序
  • Object

    { 
      name:"Jack",
      age:21, 
      girl : {
          name: "Rose", 
          age:21 
      } 
    }
    

    如果存储到索引库的是对象类型,例如上面的girl,会把girl变成两个字段:girl.name和girl.age

3.2.2 index

index影响字段的索引情况。

  • true

    字段会被索引,则可以用来进行搜索。默认值就是true

  • false

    字段不会被索引,不能用来搜索

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。

但是有些字段是我们不希望被索引的,就需要手动设置index为false。

3.2.3 store

是否将数据进行独立存储。

原始的文本会存储在 _source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从 _source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。

3.2.4 analyzer

指定分词器

一般我们处理中文会选择ik分词器 ik_max_wordik_smart

3.3 查看映射关系

3.3.1 查看单个索引映射关系

语法:

GET /索引名称/_mapping

示例:

GET /demo-index/_mapping
image-20210708104946037.png
3.3.2 查看所有索引映射关系

方式一

GET _mapping

方式二

GET _all/_mapping

3.4 修改所有映射关系

语法:

PUT /索引库名/_mapping 
{
    "properties": {
        "字段名": {
            "type": "类型",
            "index": true,
            "store": true,
            "analyzer": "分词器"
        }
    }
}

注意: 修改映射增加字段 做其它更改只能删除索引 重新建立映射

3.5 一次性创建索引和映射

刚才 的案例中我们是把创建索引库和映射分开来做,其实也可以在创建索引库的同时,直接制定索引库中的索引。

基本语法:

put /索引库名称 
{
    "settings": {
        "索引库属性名": "索引库属性值"
    },
    "mappings": {
        "properties": {
            "字段名": {
                "映射属性名": "映射属性值"
            }
        }
    }
}

示例:

PUT /demo-index2
{
  "settings": {},
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

4. 文档操作

文档,即索引库中的数据,会根据规则创建索引,将来用于搜索。可以类比做数据库中的一行数据。

4.1 新增文档

新增文档时,涉及到id的创建方式,手动指定或者自动生成。

4.1.1 手动指定id

语法:

POST /索引名称/_doc/{id}
{
    "field1": "value1",
    "field2": "value2"
}

示例:

POST /demo-index/_doc/1
{
  "name": "阿里巴巴",
  "job": "运维工程师",
  "payment": "20000.0"
}
image-20210708110152390.png
4.1.2 自动生成id

语法:

POST /索引名称/_doc
{
    "field1": "value1",
    "field2": "value2"
}

示例:

POST /demo-index/_doc
{
  "name": "百度",
  "job": "算法工程师",
  "payment": "30000.0"
}
image-20210708110338242.png

可以看到结果显示为: created ,代表创建成功。

另外,需要注意的是,在响应结果中有个 _id 字段,这个就是这条文档数据的 唯一标识 ,以后的增删改查都依赖这个_id作为唯一标示,这里是Elasticsearch帮我们随机生成的id。

4.2 查看单个文档

语法:

GET /索引名称/_doc/{id}

示例:

GET /demo-index/_doc/1
image-20210708110619314.png

文档元数据说明

元数据项 含义
_index document所属index
_type document所属type,Elasticsearch7.x默认type为_doc
_id 代表document的唯一标识,与index和type一起,可以唯一标识和定位一个document
_version document的版本号,Elasticsearch利用_version (版本号)的方式来确保应用中相互冲突的变更不会导致数据丢失。需要修改数据时,需要指定想要修改文档的version号,如果该版本不是当前版本号,请求将会失败
_seq_no 严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc seq_no大于先写入的Doc的seq_no
_primary_term 任何类型的写操作,包括index、create、update和Delete,都会生成一个_primary_term
found true/false,是否查找到文档
_source 存储原始文档

4.3 查看所有文档

语法:

POST /索引名称/_search
{
  "query": {
    "match_all": {}
  }
}

示例:

POST /demo-index/_search
{
  "query": {
    "match_all": {}
  }
}

image-20210708111108074.png

4.4 _source定制返回结果

某些业务场景下,我们不需要搜索引擎返回source中的所有字段,可以使用source进行定制,如下,多个字段之间使用逗号分隔

语法:

GET /索引名称/_doc/{id}?_source=field1,field2

示例:

GET /demo-index/_doc/1?_source=name,job
image-20210708111346776.png

4.5 更新文档

4.5.1 全部更新

把刚才新增的请求方式改为PUT,就是修改了,不过修改必须指定id

  • id对应文档存在,则修改

  • id对应文档不存在,则新增

比如,我们把使用id为3,不存在,则应该是新增

示例:

PUT /demo-index/_doc/3
{
  "name": "网易",
  "job": "算法工程师",
  "payment": "30000.0"
}
image-20210708111706889.png

可以看到是 ``created`,是新增。

我们再次执行刚才的请求,同时修改一下数据

image-20210708111842200.png

可以看到结果是: updated ,显然是更新数据

4.5.1 局部更新

Elasticsearch可以使用PUT或者POST对文档进行更新(全部更新),如果指定ID的文档已经存在,则执行更新操作。

注意:Elasticsearch执行更新操作的时候,Elasticsearch首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,但是你也无法访问,Elasticsearch会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档。

全部更新,是直接把之前的老数据,标记为删除状态,然后,再添加一条更新的(使用PUT或者POST)

局域更新,只是修改某个字段(使用POST)

语法:

POST /索引名/_update/{id} 
{ 
    "doc":{ 
        "field":"value" 
    } 
}

示例:

PUT /demo-index/_doc/3
{
    "doc":{ 
        "payment": "50000.0"
    } 
}
image-20210708112116082.png

4.6 删除文档

4.6.1 根据id进行删除

语法:

DELETE /索引名/_doc/{id}

示例:

DELETE /demo-index/_doc/3
image-20210708112253696.png

可以看到结果是: deleted ,显然是删除数据

4.6.2 根据查询条件进行删除

语法:

POST /索引库名/_delete_by_query
{
  "query": {
    "match": {
      "字段名": "搜索关键字"
    }
  }
}

示例:

POST /demo-index/_delete_by_query
{
  "query": {
    "match": {
      "name": "百度"
    }
  }
}
image-20210708112529072.png
4.6.3 删除所有文档

语法:

POST /索引名/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}

示例:

POST /demo-index/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}
image-20210708112728064.png

4.7 文档的全量替换、强制创建

  • 全量替换

    • 语法与创建文档是一样的,如果文档id不存在,那么就是创建;如果文档id已经存在,那么就是全量替换操作,替换文档的json串内容;

    • 文档是不可变的,如果要修改文档的内容,第一种方式就是全量替换,直接对文档重新建立索引,替换里面所有的内容,elasticsearch会将老的文档标记为deleted,然后新增我们给定的一个文档,当我们创建越来越多的文档的时候,elasticsearch会在适当的时机在后台自动删除标记为deleted的文档

  • 强制创建

    语法:

    PUT /index/_doc/{id}?op_type=create {},PUT /index/_doc/{id}/_create {}
    
image-20210708113947231.png

如果id 存在就会报错

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

推荐阅读更多精彩内容