初识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(不需要分词时使用) - 整数 :
byte,short,integer,long - 浮点数:
float,double - 布尔型:
boolean - 日期:
date - 对象:
object
- 字符串:
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- properties:子字段
- type:字段数据类型
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。相当于对原来那条数据,会删除旧文档,新增新文档,进行全量的替换。