ES基本概念(ES是非关系型数据库)
Index(索引-数据库):
ES 数据管理的顶层单位就叫做 Index(索引),每个 Index (即数据库)的名字必须是小写。
Type(类型-表):
Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。所以现在的ES应移除了Type的概念,不需要了解太多了
Document(文档-行):
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示,同一个 Index 里面的 Document,不要求有相同的结构(schema),但是最好保持相同,这样有利于提高搜索效率,通常用Json数据结构表示
Field(字段-列):
就像Mysql中表每一行数据里面有好多字段,每个字段的数据内容
Mapping(映射-约束):
Mapping用来定义Document中每个字段的类型(像极了Mysql数据库中创建表结构一样,这里创建每个document的字段及字段类型),包括:数据类型、是否存储、是否分词等
ES的基本使用
ES可以自动识别文档字段类型,从而降低用户使用成本
(1)直接插入文档
PUT /test_index/_doc/1 //因为使用的ES版本是6.3.1的,所以底层默认会有一个Type(默认是_doc),但是ES到了7.x之后,彻底移除了Type
{
"username":"alfred",
"age":1,
"birth":"1991-12-15"
}
(2)查看mapping
GET/test_index/doc/_mapping
{
"test_index": {
"mappings": {
"doc": {
"properties": {
"age": {
"type": "long"
},
"birth":{
"type": "date"
},
"username": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
age自动识别为long类型,username识别为text类型
IK分词器
1.为什么使用分词器
分词器主要应用在中文上,在ES中字符串类型有keyword和text两种。keyword默认不进行分词,而text是将每一个汉字拆开称为独立的词,这两种都是不适用于生产环境,所以我们需要有其他的分词器帮助我们完成这些事情,其中IK分词器是应用最为广泛的一个分词器。
2.IK分词器分类
1)最少划分ik_smart
get _analyze
{
"analyzer":"ik_smart",
"text":"我是程序员"
}
结果展示
{
"tokens" : [
{
"token": "我",
"start_offset" : 0,
"end_offset" : 1,
"type": "CN_CHAR",
"position" : 0
},
{
"token": "是",
"start_offset": 1,
"end_offset" : 2,
"type": "CN_CHAR",
"position" : 1
},
{
"token": "程序员",
"start_offset" : 2,
"end_offset" : 5,
"type": "CN_WORD",
"position" : 2
}
]
}
2)最细切分ik_max_word
get _analyze
{
"analyzer":"ik_max_word",
"text":"我是程序员"
}
输出的结果为:
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset" : 1,
"end_offset" : 2,
"type" :"CN_CHAR",
"position" : 1
},
{
"token": "程序员",
"start_offset" : 2,
"end_offset" : 5,
"type": "CN_WORD",
"position" : 2
},
{
"token" : "程序",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token": "员",
"start_offset" : 4,
"end_offset" : 5,
"type" :"CN_CHAR",
"position" : 4
}
]
}
1.每次执行POST或者PUT接口,如果文档已存在,那么相应的版本就会自动加1,即_version,之前的版本抛弃。我们可以使用op_type=create端点接口来实现
2.查询整个文档数据
GET twitter/_doc/1/_source
3.查询文档中的部分字段你
GET twitter/_doc/1?_source=user,country
3.同时请求多个id的文档数据
GET twitter/_doc/_mget
{
"ids": ["1","2"]
}
4.检查文档是否存在
HEAD twitter/_doc/1
显示OK则表示存在.
5.删除一个文档
DELETE twitter/_doc/1
6.删除一个index
DELETE twitter
当我们执行完这一条语句后,所有的在twitter中的所有的文档都将被删除。
7.open/close Index
关闭索引后,将阻止读/写操作。
POST twitter/_close,这之后再GET的话就会报错
GET twitter/_doc/1
8.冻结索引
Freeze/unfreeze index,只读索引
网友评论