ES的RESTFUL风格的API
ES的API组成结构是以RESTFUL风格的API来封装的。
我们来看一下他的API基本格式。
http://<ip>:<port>/<索引>/<类型>/<文档id>
API的URL里的每一个元素都是他的概念。即都是它的名词。
动词都是通过http方法来区分的:
GET/POST/PUT/DELETE
如何创建索引
先根据上篇博客介绍的,把ES一主二从外加head全部打开。
你会发现电脑内存立即消耗殆尽。
非结构化创建
我们选择点击【索引】,然后点击【新建索引】
我们给索引取个名字,叫house。可以看到,这里还可以调整分片和副本数。这里我默认选择5个分片和1个副本。
点击【OK】,这里显示创建成功。
我们可以看到索引的概况已经发生变化,出现我们刚刚添加的house索引。house是索引名,记住,这个要小写且不能有双划线(下划线和减号)
然后我们再到概览里看一下。这里我们可以看到0、1、2、3、4分别指的是house索引的5个分片,它们分散存在master和两台slave上。
你会发现每个分片数字都有两个,因为我们刚才设置的副本数是1。细心的你一定注意到了,每个分片中,有一个粗方框和一个细方框。粗方框代表这个分片是主分片,细方框代表分片的备份,即细方框是粗方框的备份分片。
这里还有个细节。我们点击head插件页面上house索引的信息菜单按钮,选择【索引信息】
可以看到如下:
这里我们需要注意的是一个,mappings属性。这个属性代表结构化信息,如果为空,代表次索引为非结构化索引。
{
"state": "open",
"settings": {
"index": {
"creation_date": "1523543127792",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "yAZIunJJS_-OrN5JtCHuqA",
"version": {
"created": "5060899"
},
"provided_name": "house"
}
},
"mappings": { },
"aliases": [ ],
"primary_terms": {
"0": 1,
"1": 1,
"2": 1,
"3": 1,
"4": 1
},
"in_sync_allocations": {
"0": [
"KgGw0XboSK-iVa0M-ZYjIA"
,
"cKHd13tERbKD4czontrruQ"
],
"1": [
"V7rqZ1aERyyqaZQjE44WUA"
,
"2xwY2SNUQnOhDcyfnQZCwg"
],
"2": [
"yLi3b1-aT2mCR9wnRtJ64Q"
,
"HYw9u5W1SXWSe9ka5_oA4Q"
],
"3": [
"MlYordT7T_ys_s6EB1L9_w"
,
"vssLnGOqQ7K8YO3yFTHW1g"
],
"4": [
"OWATPEyLR0eLwG5PWUBkAg"
,
"XJYOtK68RraVQDXhtzYwbw"
]
}
}
那么如何建立一个结构化索引呢?
(本文出自oschina博主happybks的博文:https://my.oschina.net/happyBKs/blog/1795508)
结构化索引创建
点击页面上【符合查询】
然后我们构建一个url来调用ES的一个API。
我们给house索引加一个类型:apartment公寓;
然后添加一个关键词_mappings,指定加一个映射。(明白为什么索引名称不能有双划线了吧,因为一些特殊用途的关键词就是以下划线开头的)
以上就是为ES添加一个结构化索引的API调用格式。下面,我们来定义一个具体的映射结构,格式为json。
我们输入一下json,为apartment索引的属性apartmentname映射一个文本类型。
我们选择【易读】复选框,点击【验证JSON】
json也一起附上:
{
"apartment": {
"properties": {
"apartmentname": {
"type": "text"
}
}
}
}
我们点击【提交请求】,提示我们创建成功,如图
然后我们点击回到【概览】。
注意:一定要点击右上角【刷新】按钮,否则无法看到我们刚才添加结构化映射的更新效果。
我们再次点击【信息】中的【索引信息】,这时候我们就能看到结构化索引的映射信息了。
{
"state": "open",
"settings": {
"index": {
"creation_date": "1523543127792",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "yAZIunJJS_-OrN5JtCHuqA",
"version": {
"created": "5060899"
},
"provided_name": "house"
}
},
"mappings": {
"apartment": {
"properties": {
"apartmentname": {
"type": "text"
}
}
}
},
"aliases": [ ],
"primary_terms": {
"0": 1,
"1": 1,
"2": 1,
"3": 1,
"4": 1
},
"in_sync_allocations": {
"0": [
"KgGw0XboSK-iVa0M-ZYjIA"
,
"cKHd13tERbKD4czontrruQ"
],
"1": [
"V7rqZ1aERyyqaZQjE44WUA"
,
"2xwY2SNUQnOhDcyfnQZCwg"
],
"2": [
"yLi3b1-aT2mCR9wnRtJ64Q"
,
"HYw9u5W1SXWSe9ka5_oA4Q"
],
"3": [
"MlYordT7T_ys_s6EB1L9_w"
,
"vssLnGOqQ7K8YO3yFTHW1g"
],
"4": [
"OWATPEyLR0eLwG5PWUBkAg"
,
"XJYOtK68RraVQDXhtzYwbw"
]
}
}
使用POSTMAN调用ES API创建索引
写过爬虫的朋友一定都用过postman,真是模拟各类http请求的好工具。
我们这里需要创建一个索引,请按照ES的服务地址和端口(注意:是ES的地址和端口,不是head插件的)
restfult api风格的API创建索引用的是http的put协议。
然后我们需要提交一个请求体位json的请求。所以选择body的raw,然后选择JSON格式。在postman中,软件会自动为你监测你将输入的json是否符合语法规则。在head插件那里还需要你自己注意格式。
我们创建的是rent租赁房屋索引。结构化索引当然需要定义一下映射。当然,我们先在settings中农定义好索引的分片数量和副本数量,我们这里默认写3和1就好。
然后我们做一下索引的映射定义mappings。格式如下。
这里我们为community类型创建其映射信息,community小区有communityname小区名称映射属性,属性值类型为文本text;属性city所在城市的值类型为关键字类型keyword。
text和keyword的区别:
keyword:存储数据时候,不会分词建立索引
text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。
age房龄属性是整型,注意是小写哦。
建造日期creationdate属性是日期类型date。
date类型的属性,可以指定format格式。
如果包含多种格式,可以将属性值中不同种类格式描述表达式用双竖线||分隔开。
它还支持时间戳的格式,这里我们用epoch_mills来表示。
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"community":{
"properties":{
"communityname":{
"type":"text"
},
"city":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"creationdate":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
},
"shop":{
}
}
}
我们为rent索引创建了一个shop商铺类型,这里我们什么映射都不定义。
之后我们提交请求。
注意是put协议请求,且这里json是为某个索引提交各个类型的映射,所以请在请求的url中把索引名称rent一起带上,否则会报错如下:
请求成功,成功创建结构化索引:
我们这时候刷新head首页,查看:
我们发现rent索引已经建立,且在我们一主二从的ES集群上已经创建了3分片、1副本的策略的结构化索引。
我们点击【信息】查看【索引信息】:
{
"state": "open",
"settings": {
"index": {
"creation_date": "1523632189666",
"number_of_shards": "3",
"number_of_replicas": "1",
"uuid": "lUrZ_KHtQcuG33MFNivX-A",
"version": {
"created": "5060899"
},
"provided_name": "rent"
}
},
"mappings": {
"shop": { },
"community": {
"properties": {
"creationdate": {
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
"type": "date"
},
"city": {
"type": "keyword"
},
"communityname": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
},
"aliases": [ ],
"primary_terms": {
"0": 1,
"1": 1,
"2": 1
},
"in_sync_allocations": {
"0": [
"CCMRsr2uSQmBj4a4GQisFQ"
,
"0RFsy8yXT6WM25oL8n5gew"
],
"1": [
"2hf4wI1BThSOHCfNqxIFQw"
,
"EUt4DmXeQa-OOFTZC9jP4g"
],
"2": [
"8z1oyQ4WSui8MZvQn7xYTg"
,
"vEbuzvxzTW2y_mokZWQSig"
]
}
}