ElasticSearch基础使用

95 阅读4分钟

初识ElasticSearch

ElasticSearch是一款开源的搜索引擎,很多人把它理解成一款数据缓存工具是偏离它的设计核心的。ES出现的契机只是一个程序员为了老婆方便搜索菜谱。所以无论是编程还是现实生活中的物品,所有产品都是用来解决人类生活问题而应运而生的。

Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。虽然它的主要功能不是为了数据缓存,但是依旧离不开把数据存入到ES的过程,其中必定会包含存入、删除、修改、查询的操作。所以我们不妨将其和数据库放在一起进行比较,方便我们理解ES中的一些相关概念。

ES数据库解释
索引(index)库(Database)ES中的索引相当于数据库的中Database。可以建立多个索引。
类型(type)表(table)type相当于数据表,在ES 7.0之前一个索引中可以构建多个类型,但是7.0之后一个索引只能有一个类型,或者说是移除了类型的概念。目的是为了简化对索引的操作。(此处的类比是有异议的,只是为了简单理解
映射(mappings)约束mapping是对类型中属性的约束和定义,比如约束是整形、浮点型、字符等等
文档(doc)一条数据(row)类型中的某一条数据,比如员工类型里存入了张三、李四的数据,那么李四这条数据我们就可以称其为一个文档,王五亦是。
属性(filed)字段文档中的属性,例如员工文档中的姓名和年龄,都是属性。

索引操作

大致了解ES中的相关概念后,我们便可以开始学习如何将数据缓存到ES中,只有先把数据缓存到ES中,我们才能去使用它的核心搜索功能。以下功能以使用ES7.0以上版本为准。 我们想要把数据存入到ES中其实和存入到数据库中是一样的,首先要建立一个库(索引),然后再新建一张表(类型)同时约束好表中每一个字段的类型。最后将一条条数据(文档)存入即可。

在这之前我们先学习mapping常见属性:

  • mapping常见属性
    • type:字段数据类型
      • 字符串: text(需要分词时使用),keyword(不需要分词时使用)
      • 整数 : byteshortintegerlong
      • 浮点数: floatdouble
      • 布尔型: boolean
      • 日期: date
      • 对象:object
    • index:是否创建索引,默认为true
    • analyzer:使用哪种分词器
    • properties:子字段

1、创建索引

PUT /employees
{
  "mappings":{
    "properties":{
      "employee_id":{
        "type":"keyword"
      },
      "first_name":{
        "type":"keyword"
      },
      "last_name":{
        "type":"keyword"
      },
      "email":{
        "type":"keyword"
      },
      "hire_date":{
        "type":"date"
      },
      "position":{
        "type":"geo_point"
      },
      "department":{
        "type":"text",
        "analyzer":"ik_smart"
      }
    }
  }
}

我们使用RESTful API创建了一张员工类型的索引。因为我们使用的是ES 7.12.1版本,所以没有了类型的概念。如果是7.0之前,创建的索引的API是PUT /megacorp/employee/1。其中megacorp是索引库的名称,employee是类型的名称,就是员工表。但是7.0之后type取消了,一个索引库中只能有一个类型。我们也可以简单理解,一个索引库就是一个类型的文档。所以上面的API,相当于同时建立了库和表结构,并将表中的字段设置了约束。

ES支持显示和隐式创建索引,上面我们使用了显示创建。显示创建是指我们指定了文档中字段的类型。如果使用隐式创建索引,那么ES会推断出各个字段的类型。


隐式创建:

POST /employees/_doc/1
{
  "employee_id": "1",
  "first_name": "John",
  "last_name": "Doe",
  "email": "john.doe@example.com",
  "hire_date": "2023-01-01",
  "position": "23.562231",
  "department": "Engineering"
}

2、操作索引

数据已经存入到了ES中,我们可以对数据进行一些常规操作。比如索引的查询、修改、删除。

  • 查询
GET /索引库
  • 修改

es其实是不支持修改的,只能新增字段

PUT /employees/_mapping
{
  "properties":{
    "age":{
      "type":"integer"
    }
  }
}
  • 删除
DELETE /索引库

文档操作

1、插入文档

POST /索引库名/_doc/文档id { "字段":"字段值"}

2、查询文档

GET /索引库名/_doc/文档id

3、删除文档

DELETE /索引库名/_doc/文档id

4、修改文档

  • 全量修改
    PUT /索引库名/_doc/文档id { "字段":"字段值"} 此处修改文档和插入文档,只是把POST的请求方式换成了PUT。相当于对原来那条数据,会删除旧文档,新增新文档,进行全量的替换。
  • 增量修改
    PUT /索引库名/_update/文档id "doc":{ "字段":"字段值"} 此处修改文档和插入文档,只是把POST的请求方式换成了PUT。相当于对原来那条数据,会删除旧文档,新增新文档,进行全量的替换。