Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与SQL类似的。
对比关系:
索引(indices)-------------------------------- 数据库
映射(mapping) ---------------- 表结构
文档(Document)---------------- Row 行
字段(Field)------------------- Columns 列
对于7.x版本来说,没有type
的概念,所以一个索引
就是一类数据(相当于数据库),也不存在一个索引下多个文档。
即一个索引(库)一个映射(表)。
详细说明:
概念 | 说明 |
---|---|
索引库(indices) | |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档(一行记录) |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
集群(cluster)
节点(node)
分片(shard)和副本(replica)
要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。
请求方式:PUT
请求路径:ip+port/索引库名
请求参数:json格式:
#http请求 PUT /索引名称
PUT http://192.168.80.121:9200/test
#自定义参数(可省略),创建索引时需要创建分片,并且后续不能修改,只能重建索引
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
#响应
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "test_1"
}
# http请求 POST
POST http://192.168.80.121:9200/_aliases
{
"actions": [
{
//添加别名可以多个索引指向一个别名
"add": {
"index": "test",
"alias": "test_aliases"
}
}
]
}
# http请求 POST
POST http://192.168.80.121:9200/_aliases
{
"actions": [
//删除别名
{
"remove": {
"index": "test",
"alias": "test_aliases"
}
}
]
}
请求方式:GET
请求路径:ip+port/_cat/indices?v
请求参数:无
#查询所有所有索引
http://192.168.80.121:9200/_cat/indices?v
# 响应
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test nwNbC8-iQru1QdBZQdxWgQ 3 2 0 0 1.8kb 624b
请求方式:GET
请求路径:ip+port/索引名称
请求参数:无
# 查询单个索引http
GET http://192.168.80.121:9200/test
# 批量查询多个索引
http://192.168.80.121:9200/test,test_3
#响应
{
# 索引名称
"test": {
# 别名
"aliases": {},
# 映射
"mappings": {},
# 设置
"settings": {
# 索引信息
"index": {
# 索引创建时间
"creation_date": "1576763960125",
# 索引主分片数量
"number_of_shards": "3",
# 索引副分片数量
"number_of_replicas": "2",
# 索引唯一标识
"uuid": "K2hPH2qXSHyz52w6ndjLBA",
# 索引版本
"version": {
"created": "7020099"
},
# 索引名称
"provided_name": "test"
}
}
}
}
# 删除索引
DELETE http://192.168.80.121:9200/test
#响应
{
"acknowledged": true
}
# 关闭索引
http://192.168.80.121:9200/test/_close
# 打开索引
http://192.168.80.121:9200/test/_open
索引有了,接下来肯定是添加数据。但是,在添加数据之前最好定义映射。
映射:类似于设置数据库的表结构,是设置字段类型、是否分词、是否索引、是否储存这些属性的一个过程
注意:
可以为一个索引多次执行
映射字段
请求,并且如果字段不存在在,会新加到映射中,但是不能删除映射。
创建映射后,在创建文档时,如果文字的字段不存在于当前索引映射中,es会字段为新增的字段自动创建一个映射。
# PUT /索引库名/_mapping
# 参数说明
{
"properties": {
"属性名(类型)": {
"type": "类型",
"analyzer": "分词器",
"index":"是否索引",
"store":"是否储存"
}
}
示例
#http请求 PUT
http://192.168.80.121:9200/test/_mapping
#请求参数
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"address": {
"type": "keyword",
"index": "false"
},
"age": {
"type": "integer",
"index": "false"
}
}
}
#响应
{
"acknowledged": true
}
ik_max_word
即使用ik分词器,必须事先安装ik分词器插件请求方式:GET
请求路径:ip+port/索引名称/_mapping
请求参数:无
#http请求 GET
http://192.168.80.121:9200/test/_mapping
#响应
{
"test": {
"mappings": {
"properties": {
"address": {
"type": "keyword",
"index": false
},
"age": {
"type": "integer",
"index": false
},
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
Elasticsearch中支持的数据类型非常丰富:
几个关键的:
String类型,分为两种:
Numerical:数值类型,分两类
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
index影响字段的索引情况。
index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
是否将数据进行额外存储,通常取默认false。
Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source
的属性中。而且我们可以通过过滤_source
来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source
以外额外存储一份数据。
# 0、查看旧索引
GET 索引库名
GET http://192.168.80.121:9200/索引名称
#1、新建一个索引(新建映射)
#新建的索引在原来索引基础上修改要更新的地方即可(比如修改字段名称、字段类型等)
#首先新建索引
PUT http://192.168.80.121:9200/test
#设置映射
PUT /索引库名/_mapping
#2、将旧索引拷贝至新索引,旧索引会自动复制新索引没有属性
#异步参数:wait_for_completion
POST http://192.168.80.121:9200/_reindex [?wait_for_completion=false]
{
"source": {
"index": "旧索引名称"
},
"dest": {
"index": "新索引名称"
}
}
#3、如果使用了别名,进行别名重构
POST _aliases
{
"actions": [
{
//添加别名可以多个索引指向一个别名
"add": {
"index": "nba3",
"alias": "nba_latest"
}
},
//删除别名
{
"remove": {
"index": "nba",
"alias": "nba_latest"
}
}
]
}
#4、替换别名后 删除旧索引
DELETE http://111.229.160.175:9200/索引名称
PUT http://111.229.160.175:9200/test
{
# 索引分片设置
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
},
# 索引映射关系
"mappings": {
"properties": {
"name": {
"type": "text"
}
}
}
}
通过POST请求,可以向一个已经存在的索引库中添加数据。
POST /索引库名/ _doc/id(主键,可以忽略)
{
"key":"value"
}
示例:
# http请求 POST ,id存在则修改,不存在则新增
http://192.168.80.121:9200/test/_doc/(id)
#参数
{
"name":"李四",
"address":"大学城一号",
"age":20
}
#响应
{
"_index": "test",
"_type": "_doc",
"_id": "1",
"_version": 4, #被修改次数
"result": "updated", #操作类型 updated/create,id存在则会是修改类型
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4, #该映射操作次数
"_primary_term": 1
}
语法
示例
#http请求 GET
http://192.168.80.121:9200/test/_doc/1
#响应
{
"_index": "test",
"_type": "_doc",
"_id": "1",
"_version": 7,
"_seq_no": 14,
"_primary_term": 1,
"found": true,
"_source": {
"title": "小米手机",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2699.00
}
}
ip+port/_mget
、 ip+port/索引名/_mget
、ip+port/索引名/_doc/_mget
1、POST /_mget
#请求参数
{
"docs":[
{
"_index":"索引名称",
"_type":"_doc",
"_id":"id"
}
]
}
2、POST 索引名/_mget
#请求参数
{
"docs":[
{
"_type":"_doc",
"_id":"id"
}
]
}
3、POST 索引名/_doc/_mget
#请求参数
{
"ids":[1,2]
}
示例
#http请求 POST
http://192.168.80.121:9200/_mget
#参数
{
"docs":[
{
"_index":"test",
"_type":"_doc",
"_id":"1"
},
{
"_index":"test",
"_type":"_doc",
"_id":"2"
}
]
}
#响应
{
"docs": [
{
"_index": "test",
"_type": "_doc",
"_id": "1",
"_version": 8,
"_seq_no": 15,
"_primary_term": 1,
"found": true,
"_source": {
"name":"李四",
"address":"大学城一号",
"age":20
}
},
{
"_index": "test",
"_type": "_doc",
"_id": "2",
"_version": 8,
"_seq_no": 11,
"_primary_term": 1,
"found": true,
"_source": {
"name":"张三",
"address":"大学城一号",
"age":22
}
}
]
}
Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。
实际中 应该先添加或者修改好映射,再添加数据,这样做可以选择哪些进行分词,哪些不分词
添加数据:
# 新增文档时,额外添加 gender、height 两个字段。
POST /test/_doc/3
{
"name":"张三",
"address":"大学城一号",
"age":22,
"gender":1,
"height":180
}
查询结果
GET /test/_doc/3
# 查看时可以看到文档增加了gender、height两个字段。
{
"_index": "test",
"_type": "_doc",
"_id": "3",
"_version": 1,
"_seq_no": 16,
"_primary_term": 1,
"found": true,
"_source": {
"name":"张三",
"address":"大学城一号",
"age":22,
"gender":1,
"height":180
}
}
索引库的映射关系
GET /test/_mapping
# 映射中增加了增加了gender、height两个字段。
{
"test": {
"mappings": {
"properties": {
"address": {
"type": "keyword",
"index": false
},
"age": {
"type": "integer",
"index": false
},
"gender": {
"type": "long"
},
"height": {
"type": "long"
},
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
id对应文档不存在时无法进行修改,修改文档只能修改id已经存在的文档内容;
修改文档时,传入了文档中不存在的字段时,字段会自动创建,并且自动生成映射关系;
1、文档全局修改
#http请求 POST
POST http://192.168.80.121:9200/test/_update/1
#参数,[6.x不要doc属性]
{
"doc": {
"name":"张三",
"address":"大学城一号",
"age":22,
"class":"一班"
}
}
# class字段不存在,会被创建,并且生成映射
2、根据id增加指定字段并且赋值
#http请求
POST http://192.168.80.121:9200/test/_update/1
#参数,添加·`school`字段
{
"script": "ctx._source.school = '北京大学'"
}
根据ID删除:
请求方式:DELETE
请求路径:ip+port/索引库名/_doc/id
请求参数:无
# DELETE /索引库名/_doc/id
#http请求 DELETE
DELETE http://192.168.80.121:9200/test/_update/1
按条件删除:
请求方式:DELETE
请求路径:ip+port/索引库名/_delete_by_query
请求参数:json
#http请求 DELETE
DELETE http://192.168.80.121:9200/test/_delete_by_query
# 请求参数
{
"query":{
"match":{
"name":"李四"
}
}
}