使用postman发送rest风格请求,(还是kibana的工具好用啊。。)
java可以使用resttemplate发送请求,不过elasticsearch提供了自己的客户端。
elasticsearch基本概念以及和mysql对应关系:
elasticsearch mysql
索引库 (indices) 数据库(database)
类型(type) 表(table)
文档(document) 行(row)
字段(field) 列(columns)
其他:集群中的概念
索引集:逻辑上完整的索引
分片:数据拆分后的各个部分
副本:每个分片的复制
elasticsearch本身就是分布式的,即使只有一个节点,他也会对数据进行分片和副本的操作,当向集群中添加数据时,数据也会在新加入的节点进行平衡
API
创建索引库:
语法:elasticsearch采用restful风格API。所以一次http请求就是api,可以使用任何工具发起http请求
创建索引的请求方式:
- 请求方式:PUT
- 请求路径:/索引库名(随便取,就是创建的索引库名字)
- 请求参数:json格式
{
"settings":{ 索引库设置
"number_of_shards":3 , 分片数量
"number_of_replicas":2 副本数量
}
}
单台机器也能弄出对应数量的分片和副本,拓展了集群后,它会自动把分片弄到新的机器上
使用kibana的工具的话直接写
PUT /索引库名字
{
"settings":{
"number_of_shards":3 , 分片数量
"number_of_replicas":2 副本数量
}
}
查看索引库
GET /索引库名称
删除索引库
DELETE /索引库名称
创建类型(类似表)
PUT /索引库名称/_mapping/类型名称
{
"properties":{
"字段名称":{
"type":"类型",
"index":true, 是否索引,默认true
"store":true, 是否存储,默认false
"analyzer":"分词器"
}
}
}例子:注意不能又空白行
PUT /hello/_mapping/goods { "properties":{ "title":{ "type":"text", "analyzer":"ik_max_word" }, "image":{ "type":"keyword", "index":false }, "price":{ "type":"float" } } }
也可以创建索引库的同时创建类型
PUT /cars 索引库名称
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"transactions":{ 类型名称
"properties": { 字段
"color":{
"type":"keyword"
},
"make":{
"type":"keyword"
}
}
}
}
}
查询类型(表)
GET /hello/_mapping/goods 查询goods类型
GET /hello/_mapping 查询所有类型
字段类型
elasticseaarch又十分丰富的字段类型:
string类型:
- text 可分词
- keyword 不可分词
数字类型:
- long
- interger
- short
- byte
- double
- float
- half_float
- scaled_float 高精度浮点数,需要指定一个精度因子,比如10 或者100,elasticsearch会把真实值乘以这个因子,取出时在还原
日期类型:
- date elasticsearch可以将时间日期格式化为字符串存储,但是建议存毫秒值,long类型,节省空间
布尔类型:
- boolean
二进制类型:
- binary
范围类型:
- interger_range,float_range,long_range,double_range,date_range
复杂类型:
1.数组类型:
2.对象类型:
比如{girl:{name:"haha",age:18}}
他会处理为girl.name和girl.age
3.
index:是否索引
true:索引(默认)
false:不索引
默认是索引的,所以有些字段不希望索引就需要手动设置为false,比如图片的地址
store:是否存储
true:存储
false:不存储(默认)
在lucene和aolr中,如果store为false,那么文档列表中姐没有这个字段的值,用户搜索结果中不会显示出来
但是ecasticsearch中,即使store为false也可以搜索到结果。原因是el在创建索引时会将文档中的原始数据备份,保存到_source的属性中,而且我们可以通过_source来选择那些显示那些不显示
而如果设置为true,就会在——source以外额外存储一份数据,多余,因此一般都设置为false。
boost及其他。。。看文档去吧
下面介绍根据id进行增删该查
新增数据
语法:
POST /索引库名称/类型名称
{
"key":"value"
}例子
POST /hello/goods { "image":"sadafsfsdfsd", "price":996, "title":"小米手机" }
新增成功可以看到返回一个id
我们可以在路径后指定id:例子
查询数据
查询所有:
索引名称
GET /hello/_search
{
"query": {"match_all": {}}
}根据id查询
索引名称/类型名称
GET /hello/goods/12
新增时候可以直接新增不存在的字段,es会自己帮助我们添加字段,字符串类型es无法判断,他就会创建俩个字段一个test一个keyword类型
修改
PUT 索引库/类型/id
{
修改的内容
}
如果不存在对应id的数据,就会新增一条
删除数据
DELETE 索引库/类型/id 根据id删除
高级查询,下一篇