Elasticsearch
索引主要结构有mapping
和setting
,下面学习一下。
{
"scorpios": {
"aliases": {},
"mappings":{
"properties":{
"name":{
"type": "text",
"index": true
},
"sex":{
"type": "text",
"index": false
},
"age":{
"type": "long",
"index": false
}
}
},
"settings": {
"index": {
"creation_date": "1650278315803",
"number_of_shards": "1",
"number_of_replicas": "1",
"uuid": "cQTAD1btTpmDcfMYzX4TtA",
"version": {
"created": "7080099"
},
"provided_name": "scorpios"
}
}
}
}
索引的Mapping
可以类比关系型数据库中的Schema
,主要包含:
boolean
等注:ElasticSearch从7.x版本开始,一个
Mapping
只属于一个索引type,即一个索引只能有一个类型type
,默认type
为_doc
下面是一个典型的mappings结构
{
"mappings": { #mappings关键字
"properties": { #字段名称和类型的定义
"name": { #字段名
"type": "text", #字段类型
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
},
"index": true
}
}
}
}
}
每个字段都有一个数据数据type
:
text
,keyword
,date
,long
, double
,boolean
等简单类型JSON
分层性质的类型,如 object
,nested
geo_point
, geo_shape
,completion
。出于不同目的,以不同方式,对同一字段建立索引通常很有用, 例如:
一个字符串字段可以被索引为text
全文搜索字段,也可以被索引为keyword
排序或聚合字段,还可以使用standard
分析器等分词器为字符串字段建立索引
大部分数据类型通过fields
参数支持多字段,在上面例子中,通过fields
来定义keyword
字段,这样就可以通过name.keyword
来实现排序或者聚合
注:mapping
中字段类型一旦设定后禁止直接修改。因为lucene
实现的倒排索引生成后不允许修改,所以在定义字段类型时候要考虑清楚
Elasticsearch
提供了动态映射的功能,即会根据用户输入的内容进行动态映射,功能如下:
在写入文档时,如果索引不存在,会自动创建索引,这种机制,使得用户无需手动定义
mappings
``Elasticsearch
会自动根据文档信息,推算出字段的类型,有时候,
Elasticsearch`可能会推算不准确,如:地理位置信息,当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。
尽管动态映射对于入门者来说非常有用,但有时仍需要自己显式指定映射,因为动态映射的类型和分词器不一定符合自身要求。所以可以在创建索引时创建字段Mapping
映射 ,也可以使用PUT Mapping API
将字段添加到现有索引中。
在创建索引时可以指定一个mapping映射,如下所示:
{
"mappings": {
"_doc": { #添加名为doc的映射类型
"properties": { #指定字段或属性
"title": { "type": "text" }, #指定title字段的类型为text
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
也可以在已有的类型上添加字段时,显式指定类型和分词器
PUT /scorpios/_mapping/my_type
{
"properties": {
"english_title": {
"type": "text",
"analyzer": "english"
}
}
}
注:
- _mapping方法表示修改mapping属性
- 已存在的字段,一旦数据被写入,就不再支持修改字段定义,需要修改已存在的字段属性,是通过Reindex api,即重建索引来实现的,在数据较多的时候,开销较大
mappings
中field
定义详细解释
setting
为ElasticSearch
索引的配置属性。索引配置项按是否可以更改,分为静态配置与动态配置。
静态配置即索引创建后不能修改,静态配置只能在创建索引时或者在状态为closed index
的索引上设置
index.number_of_shards :主分片数,默认为1,只能在创建索引时设置,不能修改
index.shard.check_on_startup :是否在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开
可选值:
index.codec:数据存储的压缩算法,默认算法为LZ4,也可以设置成best_compression,best_compression压缩比较好,但存储性能比LZ4差
index.routing_partition_size :路由分区数,默认为 1,只能在索引创建时设置。此值必须小于index.number_of_shards。
index.number_of_replicas :每个主分片的副本数,默认为 1,该值必须大于等于0
index.auto_expand_replicas :基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能)
index.refresh_interval :执行刷新操作的频率,这使得索引的最近更改可以被搜索。默认为 1s。可以设置为 -1 以禁用刷新。
index.max_result_window :用于索引搜索的 from+size 的最大值。默认为 10000
index.max_rescore_window : 在搜索此索引中 rescore 的 window_size 的最大值
index.blocks.read_only :设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。
index.blocks.read_only_allow_delete:与index.blocks.read_only基本类似,唯一的区别是允许删除动作。
index.blocks.read :设置为 true 可禁用对索引的读取操作
index.blocks.write :设置为 true 可禁用对索引的写入操作。
index.blocks.metadata :设置为 true 可禁用索引元数据的读取和写入。
index.max_refresh_listeners :索引的每个分片上可用的最大刷新侦听器数
index.max_docvalue_fields_search:一次查询最多包含开启doc_values字段的个数,默认为100。
可以在创建索引时就进行settings
配置
PUT /scorpios
{
"settings": {
"number_of_shards": "3",
"number_of_replicas": "1"
}
}
对于已存在的索引,如果想要修改它的动态配置,可以使用_settings
方法
PUT /scorpios/_settings
{
"number_of_replicas": "0"
}