Elasticsearch 6.5.3 索引管理实验记录

版权声明:转载请注明出处,码字不易,且转切珍惜 https://blog.csdn.net/weixin_40165004/article/details/88043992

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

        }

      }

    }

  }

}

 
  1. Elasticsearch内部会把日期转换成UTC(世界标准时间),并将其存储为表示milliseconds-since-the-epoch的长整型数。日期格式可以自定义。

日期类型配置映射的例子如下

PUT my_index

{

  "mappings":{

    "my_type":{

      "properties":{"date":{"type":"date"}}

    }

  }

}

写入三个文档                                执行结果分别为:

   

   

以上3个文档的日期格式都可以解析,内部存储是毫秒技术的长整型数。

  1. 布尔类型在5.4版本之前可以接受true false 的字符串和数字,5.4版本之后直接说字符串。

映射配置例子如下:

PUT my_index

{

  "mappings":{

    "my_type":{

      "properties":{

        "is_published":{"type":"boolean"}

      }

    }

  }

}

插入三条文档

   

执行查询

   

7,binary类型接受base64编码的字符串,默认不存储也不可搜索。 例子如下

写入一条文档

    

  1. array任何字段可以包含一个或者多个值,一个数组必须是同一种类型。例子 结果

有待更新完善排版,请见谅!

猜你喜欢

转载自blog.csdn.net/weixin_40165004/article/details/88043992