ES的索引库(数据表)基础操作 —— 增删改查API版
索引库就类似数据库表,mapping映射就类似表的结构,对索引库的操作就类似于对数据库表的操作(为便于理解,以下描述有一些是用数据库表来描述的)。我们要向es中存储数据,必须先创建“库”和“表”,但需要注意的是:索引库一旦创建后,不可修改,只能添加字段,因为修改结构会导致索引失效。基本语法:格式:示例:建表思路创建索引库时,需要考虑细致一点,如果遗漏了一个参数,就可能要重新创建,创建时可以根据以下
索引库操作
索引库就类似数据库表,mapping映射就类似表的结构,对索引库的操作就类似于对数据库表的操作(为便于理解,以下描述有一些是用数据库表来描述的)。
我们要向es中存储数据,必须先创建“库”和“表”,但需要注意的是:索引库一旦创建后,不可修改,只能添加字段,因为修改结构会导致索引失效。
创建索引库和映射(建表)
基本语法:
- 请求方式:PUT
- 请求路径:/索引库名(可以自定义)
- 请求参数:mapping映射
格式:
PUT /表名称
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "keyword",
"index": "false"
},
"字段名3":{
"properties": {
"子字段": {
"type": "keyword"
}
}
}
}
}
}
示例:
PUT /blog
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"author_id": {
"type": "keyword"
},
"title": {
"type": "text",
"analyzer":"ik_max_word",
"copy_to": "descriptive_content"
},
"description": {
"type": "text",
"analyzer": "ik_max_word",
"copy_to": "descriptive_content"
},
"school_code": {
"type": "integer"
},
"cover_image": {
"type": "keyword",
"index": false
},
"create_time": {
"type": "date"
},
// ...略
}
}
}
建表思路
创建索引库时,需要考虑细致一点,如果遗漏了一个参数,就可能要重新创建,创建时可以根据以下思路进行。
-
先考虑字段类型,判断是字符串还是其他类型。
-
如果是字符串类型,则考虑是否需要分词。
-
需要分词选
text
类型,并同时写好分词器。 -
不需要分词的话,直接选
keyword
类型即可。
-
-
如果是非字符串类型,直接选择对应需要的类型,无需考虑分词器。
-
-
再考虑该字段是否可能被用于查询时的过滤条件,比如用于搜索、判断等。
- 如果需要被作为查询条件,则index设置为true,但它默认就是true,所以也不用管。
- 如果不需要被作为查询条件,比如图片链接,则将index设置为false。
响应信息
Mapping属性映射(字段属性类型)
mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型,常见的简单类型有:
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float、
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引(此索引非前面所说的索引库,),默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
示例
例如下面的json文档:
{
"age": 21,
"weight": 50,
"isMarried": false,
"info": "stick",
"email": "sticki@qq.com",
"score": [99.1, 99.5, 98.9],
"name": {
"firstName": "stick",
"lastName": "i"
}
}
对应的每个字段映射(mapping):
- age:类型为 integer;参与搜索,因此需要index为true;无需分词器
- weight:类型为float;参与搜索,因此需要index为true;无需分词器
- isMarried:类型为boolean;参与搜索,因此需要index为true;无需分词器
- info:类型为字符串,需要分词,因此是text;参与搜索,因此需要index为true;分词器可以用ik_smart
- email:类型为字符串,但是不需要分词,因此是keyword;不参与搜索,因此需要index为false;无需分词器
- score:虽然是数组,但是我们只看元素的类型,类型为float;参与搜索,因此需要index为true;无需分词器
- name:类型为object,需要定义多个子属性
- name.firstName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
- name.lastName;类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器
IK分词器
IK分词器包含两种分词模式:
-
ik_smart
:最少切分 -
ik_max_word
:最细切分
查询索引库(查表)
基本语法:
-
请求方式:GET
-
请求路径:/索引库名
-
请求参数:无
格式:
GET /索引库名
示例:
GET /blog
响应信息
修改索引库(添加字段)
倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping。
虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。
基本语法:
-
请求方式:PUT
-
请求路径:/索引库名/_mapping
-
请求参数:properties
格式:
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
示例:
PUT /blog/_mapping
{
"properties": {
"author_name": {
"type": "keyword"
}
}
}
响应信息
删除索引库(删表)
基本语法:
-
请求方式:DELETE
-
请求路径:/索引库名
-
请求参数:无
格式:
DELETE /索引库名
示例:
(删除user表)
DELETE /blog
响应信息
跟上面的修改索引库一样
总结
- 创建索引库:PUT /索引库名
- 查询索引库:GET /索引库名
- 添加字段:PUT /索引库名/_mapping
- 删除索引库:DELETE /索引库名
更多推荐
所有评论(0)