ElasticSearch(2)------ES的基本操作
前言
在上篇博文中,我们安装好了ElasticSearch和Kibana管理插件,万事俱备,在这篇文章中,我们将一起来了解一下ES的基本操作.
正文
1. 倒排索引
ES使用一种叫倒排索引的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表.
比如我们有以下的文档数据,在图中左侧是每一个文档对应的文档编号,右侧是文档的内容,我对这些文档来建立倒排索引:
-
首先利用分词技术将文档自动切分成不重复的单词,切分的粒度根绝不同的分词技术有所不同,这样每个文档就转换成由多个单词构成的数据流,为了操作的方便,对每个不同的单词赋予唯一的单词编号,同时记录哪些文档中包含这个单词,结果如下:
表中第一列是单词的ID,第二列是每一个单词,第三列是包含该单词的文档ID.
-
除了记录包含的文档ID之外,索引系统还可以记录更多的信息,如下图还记录了单词在每个文档中出现的频率(TF):
初此之外还可以记录单词在某个文档中出现的位置信息.
-
有了这个索引系统,搜索引擎可以很方便的响应用户的查询.比如搜索
Facebook
,搜索系统查询倒排索引,就很容易的找到对应的文档.
2. 分词器和内置分词器
分词器: 从一串文本中切分出一个一个的词条,并对每个词条进行标准化.
分词器包含三个部分:
-
character filter
分词之前的预处理,过滤掉HTML标签,特殊符号转换等.
-
tokenizer: 分词
-
token filter: 标准化(大小写转换,同义词转换,单复数转换等)
ElasticSearch内置分词器有以下几种:
-
standard分词器
这是ES默认的分词器,它会将词汇单元转换成小写形式,并去除停用词和标点符号,支持中文的单字切分.
-
simple分词器
首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式.它会去掉数字类型的字符.
-
Whitespace分词器
仅仅是去掉空格,对字符没有lowcase化,不支持中文,并且不对生成的词汇单元进行其他的标准化处理.
-
language分词器
特定语言的分词器,不支持中文.
3. 使用中文分词器elasticsearch-analysis-ik
IK中文分词器是目前使用比较多的分词器,下面我们来配置一下IK分词器的使用
因为我们使用的Docker容器技术启动的es,所以配置中文分词器IK就不能使用以前的方式.
-
下载和ES版本对应的IK分词器
上面的地址里面有各种版本的IK分词器下载,我们只需要找到对应的版本,复制他们的ZIP版本的下载链接,比如我使用的是:
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.1/elasticsearch-analysis-ik-6.7.1.zip
-
进入ES容器,使用上面的下载地址,在ES容器中下载IK分词器
#进入ES容器 docker exec -it es bash #下载IK分词器 wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.1/elasticsearch-analysis-ik-6.7.1.zip #进入ES容器中的plugins文件夹 cd plugins #创建ik文件夹 mkdir ik #将下载的ZIP文件移动到ik文件夹,然后解压,删除zip即可
至此就完成了IK分词器的配置.
4. 使用Kibana实现文档的增删改查
安装了Kibana以后,我们可以通过Kibana的管理界面中的开发工具来对ES进行操作:
①. 创建索引
在Kibana的Dev tools中输入:
#创建指定数量和发片的索引index1
PUT /index1/
{
"settings": {
"index":{
"number_of_shards": 3,
"number_of_replicas": 0
}
}
}
#直接创建一个默认配置的索引index2
PUT index2
#查看index1索引的配置信息
GET /index1/_settings
#查看所有索引的配置信息:
GET _all/_settings
②. 添加文档
#我们在上一步的基础上在索引index1中添加一个文档
#如果用PUT方式,需要指定文档的id,在这里是1
#put语法的格式: PUT /索引/类型/文档ID
PUT /index1/users/1
{
"name" : "张三",
"age" : 30,
"about" : "我喜欢踢足球",
"interests" : [ "music" ]
}
#如果不想自己指定ID,让ElasticSearch自己生成,即用POST方式添加
POST /index1/users/
{
"name" : "王五",
"age" : 35,
"about" : "我是王五",
"interests" : [ "music" ]
}
③. 查看文档
#查看刚才添加的文档,需要指定文档id
GET /index1/1
#如果我们只想查看文档中的某个属性的内容,比如查看name和about:
GET /index1/users/1?_source=name,about
④. 更新文档
-
使用PUT命令覆盖原来的文档信息
#对前面添加的id为1的文档进行覆盖,使其年龄变为40 PUT /index1/users/1 { "name" : "张三", "age" : 40, "about" : "我喜欢踢足球", "interests" : [ "music" ] }
-
使用POST命令只修改对应的文档属性
#格式:POST /索引/类型/文档id/_update #这里的_update是es提供的命令,可以对指定的文档属性进行修改,要修改的属性名放在doc中. POST /index1/users/1/_update { "doc": { "age":80 } }
⑤. 删除文档&索引
#删除文档时指定文档ID
DELETE /index1/users/
#删除索引
DELETE /index2
5. 使用ES提供的MultiGet批量获取文档
ElasticSearch提供了MultiGetAPI来批量获取文档,可以基于curl命令获取,也在客户端工具中使用下面的方式来获取.
我们在Kibana中使用一下方式批量获取文档:
#使用GET命令,以及_mget代表批量获取文档,在命令中的docs属性中指明要获取的文档所在的索引、类型和文档ID
GET /_mget
{
"docs":[
{
"_index":"index1",
"_type":"users",
"_id":"1"
},
{
"_index":"index1",
"_type":"users",
"_id":"2"
},
{
"_index":"index1",
"_type":"users",
"_id":"3"
}
]
}
也可以在批量获取的时候,指定返回某个文档的具体一个字段
#也可以在批量获取的时候,指定返回某个文档的具体一个字段
GET /_mget
{
"docs":[
{
"_index":"index1",
"_type":"users",
"_id":"1",
"_source":["name"]
},
{
"_index":"index1",
"_type":"users",
"_id":"2",
"_source":["name","age"]
},
{
"_index":"index1",
"_type":"users",
"_id":"3",
"_source":["about"]
}
]
}
获取同索引同类型下的不同文档
GET /index1/users/_mget
{
"docs":[
{
"_id":1
},
{
"_id":2,
"_source":["age","about"]
}
]
}
也可以简化命令,指定文档id即可批量获取:
#批量获取文档id为1,2,3的文档
GET /index1/users/_mget
{
"ids":[1,2,3]
}
6. 使用Bulk API实现批量操作
前面我们使用MultiGet只能批量的获取文档,ES还提供了BulkAPI来对文档进行批量的更新、删除等操作.
首先,bulk的格式:
{action:{metadata}}
{requestbody}
action代表行为,有以下几个选择:
- create: 文档不存在时创建
- update: 更新文档
- index: 创建新文档或替换已有文档
- delete: 删除一个文档
如果数数据存在,使用create操作会失败,且提示文档已存在;使用index则可以成功执行.
metadate代表操作的数据,有_index
、_type
、_id
三种
在Kibana上使用bulk API如下:
添加操作:
#下面的是在index2所以的books类型中添加了三个文档
POST /index2/books/_bulk
{"index":{"_id":1}}
{"name":"java","price":50}
{"index":{"_id":2}}
{"name":"PHP","price":100}
{"index":{"_id":3}}
{"name":"C++","price":150}
修改和删除:
POST _bulk
{"create":{"_index":"index1","_type":"users","_id":11}}
{"name":"张11"}
{"update":{"_index":"index2","_type":"books","_id":3}}
{"doc":{"price":250}}
{"delete":{"_index":"index1","_type":"users","_id":1}}
总结
以上就是在Kibana中使用不同的API来操作文档和索引,在使用的时候,一定要注意各种命令的格式,避免写错.