Elasticsearch集群学习记录
1.Elasticsearch索引管理
新建索引命令
PUT 索引名
删除索引
DELETE 索引名
查看索引
GET 索引名/_settings
可同时查看多个索引。 GET 索引名1,索引名2/_settings
查看集群中所有的索引信息,命令如下: GET _all/_settings
索引的打开关闭
POST 索引名/_open 打开
POST 索引名/_close 关闭
可以同时操作多个索引,操作全部的使用这个关键字_all
2.Elasticsearch文档管理
新建文档
命令如下:
结果如下
其中index/type/id用于确定文档所在的位置,版本号会随着文档的更新自动递增,shards用于显示分片信息。如果不指定id会自动生成。上述例子去掉id后执行索引文档命令:
响应结果如下:
获取文档
使用GET API查看存存储在Elasticsearch中的文档。返回格式为json类型。
结果如下:
如果查询文档不存在,响应信息会返回 “found”:false
使用HEAD命令可以坚持一个文档是否存在。
若存在返回“200-OK”,反之返回“404-Not Found”
根据id一次获取多个文档,使用Muti GET API根据索引名、类型名、id(或路由)一次获取多个文档,返回一个文档数组。
GET blog/_mget
{
"docs":[
{
"_type":"TypeA",
"_id":"1"
},
{
"_type":"typeB",
"_id":"2"
}
]
}
如果是一个index下的不同type,可简写如下:
GET blog/article/_mget
{
"docs":[
{
"_id":"1"
},
{
"_id":"2"
}
]
}
如果index和type都相同,可简写为
GET blog/article/_mget
{
"ids":["1","2"]
}
更新文档
文档被索引后如果要更新,需要先找到这个文档,删除就得文档内容执行更新,更新完再索引。
PUT test/type1/1
{
"counter":1,
"tags":["red"]
}
POST test/type1/1/_update
{
"script":{
"inline":"ctx._source.counter+=params.count",
"lang":"painless",
"params":{
"count":4
}
}
}
inline是执行的脚本,ctx是脚本语言中的一个执行对象,painless是Elasticsearch内置的一种脚本语言,params是参数集合。使用painless脚本更新文档,通过ctx获取_source再修改counter字段,counter字段等与原值加上count参数的值。
ctx对象处理可以访问_source之外,还可以访问_index _type _id _version _routing _parent等字段。
GET test/type1/1
#explian painless is elasticsearch insert script language
POST test/type1/1/_update
{
"script":{
"inline":"ctx._source.tags.add(params.tag)",
"lang":"painless",
"params":{
"tag":"blue"
}
}
}
增加一个字段
POST test/type1/1/_update
{
"script":"ctx._source.new_field= \"value_of_new_field\""
}
删除一个字段
POST test/type1/1/_update
{
"script":"ctx._source.remove(\"new_field\")"
}
查询更新
对title中包含git关键字的文档增加一个category字段。
POST blog/_update_by_query
{
"script":{
"inline":"ctx._source.category=params.category",
"lang":"painless",
"params":{"category":"git"}
},
"query":{
"term":{"title":"git"}
}
}
删除文档
Delete API允许基于指定的id从索引库中删除一个文档,删除文档命令如下
DELETE blog/article/1
如果在索引文档时指定了路由,删除时也可以增加路由参数
DELETE blog/article/1?routing=user123
3.Elasticsearch映射分析
查看映射Mapping
GET 索引名/_mapping
此时books索引的Mapping是空的,添加文档命令如下:
添加完后查看Mapping,返回结果如下:
Id 、pulish_date 、name被推测的类型就是动态映射的功劳。使用动态映射需要结合实际业务需求综合考虑。如果将elasticsearch当做主要的数据存储使用,并且希望出现未知字段时抛出异常来提醒你注意这一问题,那么开启动态mapping并不适用。
例如以下实例写入三个文档,第三个会因为没有定义“author”而抛出异常。
日期检测
当elasticsearch碰到一个新的字符串类型的字段时,它会检查这个字符串是否包含一个可以识别的日期,如果看着像日期会被识别成为date类型,否自将会作为String字段进行添加,这种检测机制存在一定的问题,假设有这样的一份文档到elasticsearch中:
{“note”: ”2014-01-01”}
当note字段第一次被发现,会根据规则将它作为date字段添加,如果下一篇文档是这样的:
{“note”: “logged out”},此时会抛出异常,可以使用date_detection 设置为false来关闭日期检测。如下命令:
结果
有了以上的映射,一个字符串总会被当成String类型,如果需要新增一个date类型的字段,需要进行手动添加。
静态映射
静态映射是在创建索引手工指定索引映射,和SQL在建表语句中指定字段属性类似。相比动态映射,通过静态映射可以添加更详细、更精准的配置信息。
运行代码报错原因如下:
在elasticsearch6.0.0或者更高版本,创建的索引只能包含单个映射类型。在5.x中创建具有多个映射理性的索引将继续像以前一样在elasticsearch6.x中工作。映射类型将在elasticsearch7.0.0中完全删除。
官网文档声明 :链接
单独执行一个映射的话如下
结果如下
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0; if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
默认分片数将从5变为1在7.x版本,如想使用默认的5可以新建带有索引模板的索引请求
#! Deprecation: [_all] is deprecated in 6.0+ and will be removed in 7.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.
_all将在7.x中消失。如果想使用改属性,可以使用copy_to 。
字段类型
Elasticsearch字段类型
一级分类 |
二级分类 |
具体类型 |
核心类型 |
字符串类型 |
string text keyword |
数字类型 |
long integer short byte double float half_float scaled _float |
|
日期类型 |
date |
|
布尔类型 |
boolean |
|
二进制类型 |
binary |
|
范围类型 |
range |
|
复合类型 |
数组类型 |
array |
对象类型 |
object |
|
嵌套类型 |
nested |
|
地理类型 |
地理坐标 |
geo_point |
地理图形 |
geo_shape |
|
特殊类型 |
IP类型 |
ip |
范围类型 |
completion |
|
令牌计数类型 |
token_count |
|
附件类型 |
attachment |
|
抽取类型 |
percolator |
类型相关注意事项:
1. elasticsearch 5.x之后的字段不在支持string类型,由text 或者keyword 进行替代。
2. 如果一个字段想被全文检索到,需要设置为text类型。此种类型会被分词,内容会被拆分。不用于排序,很少使用聚合(termAggregation除外)。
把full_name 字段设为text类型的》Mapping如下:
PUT my_index
{
"mappings":{
"my_type":{
"properties":{
"full_name":{
"type":"text"
}
}
}
}
}
3. keyword 类型适合于索引结构化的字段。如:email地址,主机名,状态码和标签。通常用于过滤、排序、聚合。类型为keyword的字段需要精确值搜索,区别与text 类型。
4. 数字类型及其取值范围
类型 |
取值范围 |
类型 |
取值范围 |
long |
-2^64~2^63 -1 |
double |
64位双精度IEEE754浮点类型 |
integer |
-2^31~2^32 -1 |
float |
32位单精度IEEE754浮点类型 |
short |
-32768~32767 |
half_float |
16位半精度IEEE754浮点类型 |
byte |
-128~127 |
scaled_float |
缩放类型的浮点数 |
对于数字类型的字段,在满足需求的情况下,尽量选择范围小的数据类型。
字段的长度越短,搜索和索引的效率就越高。
处理浮点数时,优先考虑scaled_float,elasticsearch底层就是整数类型,压缩整数比压缩浮点数更加节省空间。
数字类型配置映射的例子如下:
PUT my_index
{
"mappings":{
"my_type":{
"properties":{
"number_of_bytes":{"type":"integer"},
"time_in_seconds":{"type":"float"},
"price":{
"type":"scaled_float",
"scaling_factor":100
}
}
}
}
}
- Elasticsearch内部会把日期转换成UTC(世界标准时间),并将其存储为表示milliseconds-since-the-epoch的长整型数。日期格式可以自定义。
日期类型配置映射的例子如下
PUT my_index
{
"mappings":{
"my_type":{
"properties":{"date":{"type":"date"}}
}
}
}
写入三个文档 执行结果分别为:
以上3个文档的日期格式都可以解析,内部存储是毫秒技术的长整型数。
- 布尔类型在5.4版本之前可以接受true false 的字符串和数字,5.4版本之后直接说字符串。
映射配置例子如下:
PUT my_index
{
"mappings":{
"my_type":{
"properties":{
"is_published":{"type":"boolean"}
}
}
}
}
插入三条文档
执行查询
7,binary类型接受base64编码的字符串,默认不存储也不可搜索。 例子如下
写入一条文档
- array任何字段可以包含一个或者多个值,一个数组必须是同一种类型。例子 结果
有待更新完善排版,请见谅!