分布式文档数据库elasticsearch基础整理| 豆包MarsCode AI刷题

67 阅读5分钟

数据类型

按照是否支持分词分为两大类:支持分词的数据类型,如text,match_only_text等,不支持的分词的数据类型,如keyword,date,数值型。也可以分为基本数据类型和复杂数据类型。

基本数据类型

数字类型

类型说明
byte
integer
short
long
double
float
half_float半精度16位浮点数
scaled_float缩放类型浮点数,按固定doble比例因为缩放
unsigned_long无符号64位整形

binary:编码为base64字符串的二进制值

boolean:布尔类型

alias:字段别名

keywords:包括keyword,constant_keyword和wildcard

dates:包括date,date_nanos

date的格式有yyyy-MM-dd HH:mm:ssyyyy-MM-dd时间戳

对象关系类型(复杂类型)

  • object:非基本数据类型,默认的json对象为object
  • flattened:单映射对象类型,其值为json
  • nested:嵌套数据类型
  • join:父子级关系类型

结构化类型

Range,IP,version,number3

聚合数据类型

aggregate_metric_double,histogram

文本搜索字段

text,completion,

es默认情况下会为text类型创建倒排索引

文档排名类型

空间数据类型

geo_point

其它数据类型

映射参数

analyzer:指定分词器,只有text类型字段才支持

coerce:是否支持强制类型转换

常用DSL总结

索引

  • 索引名和字段名命名规范:1.英文全小写 2.不要使用驼峰3.多个单词之间用_分隔

  • 索引的不可变性:索引创建成功后,索引名称、主分片数量(但可以修改副本数量)、字段类型不可变。

不可以删除某个字段,但可以新增字段。

查询索引

es8和es6相同

GET /索引名
或
GET /索引名/_mapping

删除索引

es8和es6相同

DELETE 索引名

创建索引

es8

PUT /索引名
{
  "settings":{
        
 },
  "mappings": {
    "properties": {
      "field1": {
        "type": "text"
      },
      "field2": {
        "type": "keyword"
      }
    }
  }
}

es8中默认一个索引中只有_doc一种type,创建索引时不用指定type,指定type会报错,指定_doc也不行

es6

PUT /索引名
{
  "settings":{
    "number_of_shards": 1,
    "number_of_replicas": 1
 },
  "mappings": {
    "类型名":{
      "properties": {
      "新字段": {
        "type": "字段类型"
      }
    }
   }
  }
}

es6中创建索引必须指定类型,不然会报错

修改索引

一个索引一旦创建后不可以删除字段、修改字段数据类型

添加新字段

es6

PUT 索引名/_mapping/类型名
{
    "properties":{
        "新字段名":{
            "type":"新字段类型"
        }
    }
}

es8

PUT 索引名/_mapping
{
    "properties":{
        "新字段名":{
            "type":"新字段类型"
        }
    }
}

修改settings

可以通过settings api修改某些settings,比如副本数量、index_refresh_interval、index_max_result_windows

PUT 索引名/_settings
{
    "number_of_replicas":3
}

reindex

reindex不是重建索引,而是将一个索引中的数据重建到另一个索引中

POST _reindex
{
    "source":{
        "index":"源索引名"
    },
    "dest":{
        "index":"目标索引名"
    }
}

文档

新增文档

手动指定id,使用PUT

新增文档时可选op_type参数,该参数有create、index两个值。create:不存在则创建,存在则报错。index:不存在则创建,存在则覆盖

# 也可写为 /索引名/_create/文档id 
PUT /索引名/_doc/文档id/?op_type=create
{
    "字段名":"字段值",
    "字段名":"字段值"
}
# 不可写为 /索引名/_index/文档id 
PUT /索引名/_doc/文档id/?op_type=index
{
    "字段名":"字段值",
    "字段名":"字段值"
}

使用index时,如果id为某个值的文档已经存在,则会全量更新!!!

或者

PUT /索引名/_doc/1
{
    "字段名":"字段值"
}

也是全量替换!!!

自动生成id,使用POST

# 也可以 /索引名/_doc/id  指定id
POST /索引名/_doc
{
    "属性名":"属性值"
}

查询文档

_source

source api控制返回哪些字段

如果设置为false,则只返回元数据

GET /索引名/_doc/文档id?_source=false #此处值默认就是true

也可以使用_source只查询source源数据,不返回元数据

GET /索引名/_source/文档id
批量查询文档
GET /_mget
{
    "doc":[
        {
            "_index":"索引名",
        	"_id":"文档id"
        },
        {
            "_index":"索引名",
        	"_id":"文档id"
		}
    ]
}
# 可以批量查询多个索引里的多个文档
GET /索引名/_mget
{
    "ids":[
        1,2
    ]
}
#根据id批量查询一个索引里的多个文档

更新文档(增量更新)

使用_update api(通过文档id更新)

POST /索引名/_update/文档id
{
    "doc":{
        "属性名":"属性值",
        "属性名":"属性值"
    }
}
# 通过文档id更新

在7.x之前的版本还可以这样写

POST /索引名/_doc/文档id/_update
{
    "doc":{
        "属性名":"属性值"
    }
}

bulk

批量插入文档
POST /_bulk
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}
{"action":{"_index":"索引名","_id":"文档id"}}
{"属性名":"属性值","属性名":"属性值"}

# action的值可选index和create,跟前面一样
批量更新文档
POST /_bulk
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}
{"update":{"_index":"索引名","_id":"文档id"}}
{"doc":{"属性名":"属性值","属性名":"属性值"}}

批量删除文档
POST /_bulk
{"delete":{"_index":"goods","_id":"100"}}
{"delete":{"_index":"goods","_id":"101"}}

tips:1. 每个bulk写完后,最后要有一个换行2.bulk中的一个失败不会影响其它的

根据query删除

删除时并不一定每次都知道文档id,通过具体查询条件删除

POST /索引名/_delete_by_query
{
    "query":{
        "term":{//或match
            "字段名":"字段值"
        }
    }
}
根据query更新

Mapping

自动映射

es运行可以不用像mysql等关系型数据库一样需要提前创建表结构,可以直接插入文档,由自动映射器自动确定类型。自动映射器推断字段类型的规则:

field typedymaicruntime
true|falsebooleanboolean
小数floatdouble
整数longlong
objectobject-
数组取决于数组中第一个非空元素的类型同左
日期格式字符串datedate
数字类型字符串text
其它字符串text+keywordkeyword

自动映射模版

将某一类字段自动映射成特定的数据类型

match_mapping_type

用于匹配数据类型

PUT /索引名
{
    "mappings":{
        "dynaic_templates":[
            {
                "模版名":{
                "match_mapping_type":"long",
                 "match":"num_*",   //表示字段名以num_开头
                 "unmatch":"*_text",  //表示字段名不以_text结尾
                "mapping":{
                    "type":"integer"
                }
               }
            },
            {
                "模版名":{
                    "match_mapping_type":"string",   //string表示文本
                    "mapping":{
                        "type":"keyword"
                    }
                }
            }
		]
    }
}

高阶查询

match

POST /索引名/_search
{
    "query":{
        "match":{
            "字段名":"字段值" 
        }
    }
}

match_all

可以认为和直接GET /索引名/_search查询没什么区别