索引
1、基本介绍
ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,
文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量,配置刷新频率,分配分析器等,存储在索引中的海量文档分布式存储在ElasticSearch集群中。
ElasticSearch是基于Lucene框架的全文搜索引擎,将所有文档的信息写入到倒排索引(Inverted Index)的数据结构中,倒排索引建立的是索引中词->文档之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的。
ElasticSearch的对象模型,跟关系型数据库模型相比:
- 索引(Index):相当于数据库,用于定义文档类型的存储;在同一个索引中,同一个字段只能定义一个数据类型;
- 文档类型(Type):相当于关系表,用于描述文档中的各个字段的定义;不同的文档类型,能够存储不同的字段,服务于不同的查询请求;
- 文档(Document):相当于关系表的数据行,存储数据的载体,包含一个或多个存有数据的字段;
- 字段(Field):文档的一个Key/Value对;
- 词(Term):表示文本中的一个单词;
- 标记(Token):表示在字段中出现的词,由该词的文本、偏移量(开始和结束)以及类型组成;
注意ES每个大版本之间区别很大:
- ES 5.x中一个index可以有多种type。
- ES 6.x中一个index只能有一种type。
- ES 7.x以后 要逐渐移除type这个概念。
2、索引操作
2.1创建索引
创建索引的语法是:
- json中指定了分片和副本
PUT /book
{
"settings": {
"number_of_shards": 3, // 分片数量
"number_of_replicas": 1 // 副本数量
}
}
//响应
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "book"
}
更新副本
PUT /book/_settings
{
"number_of_replicas": 2
}
2.2 查看索引
查看索引有多个命令
GET /{索引名字}
GET /{索引名字}/_settings
GET /{索引名字1},{索引名字} // 多个索引
GET /_all/_settings // 所有索引
GET /book/_settings
响应
{
"book" : {
"settings" : {
"index" : {
"creation_date" : "1685374213814",
"number_of_shards" : "3",
"number_of_replicas" : "1",
"uuid" : "RSp6a840TI2nbGU6sswqHw",
"version" : {
"created" : "7060299"
},
"provided_name" : "book"
}
}
}
}
2.3 删除索引
DELETE /{索引名字}
2.4 索引的打开与关闭
Elasticsearch 中,索引是有打开和关闭状态的,关闭的索引,几乎不占用资源;
已经关闭的索引不可以进行读写;
- POST /{索引名字}/_close // 关闭索引
- POST /{索引名字}/_open // 开启索引
- POST /_all/_close // 打开所有
- POST /_all/_open // 关闭所有
2.5 更新副本
Elasticsearch 允许更新索引副本数量
2.6 索引别名
索引别名就是给一个索引或者多个索引起的另一个名字,下面为给索引book取别名为mybook
POST /_aliases
{
"actions": [
{
"add": {
"index": "book",
"alias": "mybook"
}
}
]
}
查询索引别名
GET /_aliases
返回结果
{
"book": {
"aliases": {
"mybook": {
}
}
}
}
3、文档操作
文档是索引中数据的基本单位,类似于关系型数据库中的一条记录,文档的在ES中以json的数据格式存储。
3.1 创建文档
索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。
如果想要自定义唯一性标识,需要在创建时指定。推荐使用下面这种方式创建文档。
POST /shopping/_doc
{
"title": "小米手机",
"category": "小米",
"images": "http://xiaomi.com",
"price": 3999.00
}
响应
{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "fUljaIgBAWp6P_bPXRhC",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
3.2查看单个文档:主键查询
3.3查看所有文档:全查询
# "query":这里的 query 代表一个查询对象,里面可以有不同的查询属性
# "match_all":查询类型,例如:match_all(代表查询所有), match,term , range 等等
# {查询条件}:查询条件会根据类型的不同,写法也有差异
3.4 修改文档中的全部字段
POST /shopping/_doc/fUljaIgBAWp6P_bPXRhC
{
"title": "小米手机222",
"category": "小米",
"images": "http://xiaomi.com",
"price": 3999.00
}
//响应
{
"_index" : "shopping",
"_type" : "_doc",
"_id" : "fUljaIgBAWp6P_bPXRhC",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
3.5删除文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。在 Postman 中,向 ES 服务器发 DELETE 请求。
DELETE /shopping/_doc/fUljaIgBAWp6P_bPXRhC
4.映射相关操作
索引映射节(mappings)
索引结构
索引是由文档类型构成的,在mappings字段中定义索引的文档类型,示例代码中为blog索引定义了三个文档类型:articles,followers和comments
{
"mappings": {
"articles": {
},
"followers": {
},
"comments": {
}
}
}
字段的数据类型由字段的属性type指定,ElasticSearch支持的基础数据类型主要有:
- 字符串类型:string;
- 数值类型:字节(byte)、2字节(short)、4字节(integer)、8字节(long)、float、double;
- 布尔类型:boolean,值是true或false;
- 时间/日期类型:date,用于存储日期和时间;
- 二进制类型:binary;
- IP地址类型:ip,以字符串形式存储IPv4地址;
- 特殊数据类型:token_count,用于存储索引的字数信息
字段的公共属性
- index:该属性控制字段是否编入索引被搜索,该属性共有三个有效值:analyzed、no和not_analyzed:
- analyzed:表示该字段被分析,编入索引,产生的token能被搜索到;
- not_analyzed:表示该字段不会被分析,使用原始值编入索引,在索引中作为单个词;
- no:不编入索引,无法搜索该字段;
- 其中analyzed是分析,分解的意思,默认值是analyzed,表示将该字段编入索引,以供搜索。
- store:指定是否将字段的原始值写入索引,默认值是no,字段值被分析,能够被搜索,但是,字段值不会存储,这意味着,该字段能够被查询,但是不会存储字段的原始值。
- boost:字段级别的助推,默认值是1,定义了字段在文档中的重要性/权重;
- include_in_all:该属性指定当前字段是否包括在_all字段中,默认值是ture,所有的字段都会包含_all字段中;如果index=no,那么属性include_in_all无效,这意味着当前字段无法包含在_all字段中。
- copy_to:该属性指定一个字段名称,ElasticSearch引擎将当前字段的值复制到该属性指定的字段中;
- doc_values:文档值是存储在硬盘上的索引时(indexing time)数据结构,对于not_analyzed字段,默认值是true,analyzed string字段不支持文档值;
- fielddata:字段数据是存储在内存中的查询时(querying time)数据结构,只支持analyzed string字段;
- null_value:该属性指定一个值,当字段的值为NULL时,该字段使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,当一个字段设置为NULL值,ElasticSearch引擎认为该字段没有任何值,使用该属性为NULL字段设置一个指定的值,使该字段能够被索引和搜索。
映射相关操作
查询文档映射
GET /{索引}/_mappings
响应(此映射为es根据文档创建的动态映射)
{
"blog": {
"mappings": {
"properties": {
"content": {
"type": "text",
//text类型"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
//text类型"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
创建静态映射
PUT /{索引名称}
{
"properties": {
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
创建索引并添加映射
PUT /{索引名称}
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"address": {
"type": "text"
}
}
}
}