Create
PUT or POST
Read
GET
Update
PUT or POST
Delete
DELETE
上一篇文章中,我们学习了Kibana,接下来,就切换到Kibana的控制台。
1. 创建索引
通过如下命令,创建一个flight索引:
PUT /flight
GET /_cluster/health
请注意,现在群集的运行状况已从绿色变为黄色。 发生这种情况是因为我们仅运行一个Elasticsearch实例。 单节点群集具有完整的功能,但是无法将数据复制到其他节点以提供弹性。 副本分片必须有其他可用节点,群集状态才能变为绿色。 如果群集状态为红色,则标识某些数据不可用。
为了解决这个问题,您需要安装另一个同样的Elasticsearch,并在elasticsearch.yml中更改node.name; 两个实例中的cluster.name必须保持相同(默认为elasticsearch)。
另一种方法是在命令行上将配置参数传递给Elasticsearch。
bin/elasticsearch -Enode.name=node-2 -Epath.data=./node-2/data -Epath.logs=./node-2/logs
GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open flight w696u4y3SYWuGW--8VzW6Q 1 1 0 0 208b 208b
2. 创建文档
下面,向我们的索引添加一些示例数据:
PUT /flight/_doc/1
{
"Icao":"A0835D",
"Alt":2400,
"Lat":39.984322,
"Long":-82.925616
}
也可以使用curl命令:
curl -X PUT "localhost:9200/flight/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"Icao":"A0835D",
"Alt":2400,
"Lat":39.984322,
"Long":-82.925616
}'
在这种情况下,ElasticSearch将为我们的文档生成一个自动ID。 这是ElasticSearch返回的结果:
Content-Type对于查询成功至关重要, 我们创建了一个ID = 1的新排期。我们也可以使用POST代替PUT,但是在这种情况下,我们无法传递ID。
在这种情况下,ElasticSearch将为我们的文档生成一个自动ID。
下面是ElasticSearch返回的结果:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "flight",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"Icao" : "A0835D",
"Alt" : 2400,
"Lat" : 39.984322,
"Long" : -82.925616
}
}
]
}
}
结果文档存储在键值_source内。
3. 删除文档
如果你知道文档索引,可以直接通过索引进行删除:
DELETE /flight/_doc/1
4. 删除索引
通过下方命令删除索引:
DELETE /flight
5. 批量导入数据
我们的方案是处理航班数据,理想情况下,这些数据是从多个传感器(雷达)实时获得的,但是由于这很难实现。
因此,我们将使用可从此处下载的批量历史飞行数据。
在下载批处理文件的目录中,发送以下命令(每个.json文件):
curl -H "Content-Type: application/x-ndjson" -XPOST http://localhost:9200/flights/_bulk --data-binary "@2016-07-01-1300Z.json"
请注意,内容类型是application/x-ndjson,而不是application/x-json。
另外,请注意,我们将数据表示为二进制以便保留换行符。
磁瓦ElasticSearch需要json文档满足特定格式:
{"index":{"_id":4800770}}
{"Rcvr":1,"HasSig":false,"Icao":"494102", "Bad":false,"Reg":"CS-PHB", ...}
...
这意味着你必须将每个下载的.json文件转换为上述格式。
如果你不想花时间手动修改.json文档,则在下一篇文章中,我们将开发一个Java程序来解析它们,并使用ElasticSearch的REST API将文件插入ElasticSearch中。
6. 搜索查询
ElasticSearch是一款搜索相关的工具,它允许你进行符合条件的搜索查询。
GET /flight/_search?pretty
{ "query": {
"match_all" : {
}
}
}
上面的搜索查询匹配索引对应的所有文档。 也可以这样简化:
GET /flight/_search
下面是根据给定字段Icao进行查询:
GET /flight/_search?pretty
{ "query": {
"match" : {
"Icao" : "A0835D"
}
}
}
也可以用嵌入URL进行搜索:
GET /flight/_search?q=Icao:A0835D
也可以这样写:
GET /flight/_search?pretty
{ "query": {
"query_string": {
"query": "Icao:A0835D"
}
}
}
除了“match”和“query_string”以外,还可以使用“term”。 使用“ term”表示精确匹配。
GET /flight/_search?pretty
{ "query": {
"term": {
"Mil": true
}
}
}
你也可以使用“term”来搜索值数组。
除此之外,还可以使用通配符“wildcard”进行搜索,包括*/?。
GET /flight/_search?pretty
{ "query": {
"wildcard": {
"Call": "NJ*"
}
}
}
7. 更新文档
如果你知道索引的ID,可以通过_updateAPI进行更新。
POST /flight/_update/4800770
{
"doc": {
"Mil": true
}
}
使用上述命令,我们也可以将新字段添加到文档中。
附带说明一下,ElasticSearch文档是不可变的!
因此,当我们请求更新文档时,ElasticSearch会在后台进行操作,它检索文档,更改其字段并为具有相同ID的文档重新索引,从而对它进行替换。
可以使用脚本发送更复杂的查询,
POST /flight/_update/4800770
{
"script": {
"source": "ctx._source.FlightsCount++"
}
}
ctx表示上下文。
还有许多其他更新文档的方法,例如,upserts,即根据文件是否已存在有条件地更新或插入文件。
POST /flight/_update/4800771
{
"script": {
"source": "ctx._source.FlightsCount++"
},
"upsert": {
"Rcvr":1,
"HasSig":false,
"Icao":"AE4839",
...
},
}
8. 删除文档
使用_delete_by_query API可以删除文档:
POST /flight/_delete_by_query
{
"query": {
"match_all": {}
}
}
9. 批量查询
批量API可帮助我们通过一个查询对许多文档执行同样的操作。
该API包含4个动作:索引,创建,更新,删除:
POST /_bulk
{ "index": { "_index" : "flight", "_id": 10519389 } }
{ "Rcvr":1,"HasSig":true,"Sig":0,"Icao":"A0835D","Bad":false, ... }
{ "create": { "_index" : "flight", "_id": 4800770 } }
{"Rcvr":1,"HasSig":false,"Icao":"494102","Bad":false, ... }
{ "update": { "_index" : "flight", "_id": 4800770 } }
{ "doc": {"Mil": true } }
{ "delete": { "_index" : "flight", "_id": 4800770 } }
索引和创建操作之间的区别如下:如果文档已经存在,则创建将引发错误,而索引将替换文档。
如果批量查询要针对相同的索引运行,那么我们可以像这样简化查询:
POST /flight/_bulk
{ "index": { "_id": 10519389 } }
{ "Rcvr":1,"HasSig":true,"Sig":0,"Icao":"A0835D","Bad":false, ... }
{ "create": { "_id": 4800770 } }
{"Rcvr":1,"HasSig":false,"Icao":"494102","Bad":false, ... }
{ "update": { "_id": 4800770 } }
{ "doc": {"Mil": true } }
{ "delete": { "_id": 4800770 } }
10. 映射
ElasticSearch是如何映射数据的呢?
动态映射意味着没有明确定义映射,或者至少没有为某些字段定义。
ElasticSearch是通过检查文档字段的值类型来完成的。
要查看数据映射,请在Kibana中执行以下内容:
GET /flight/_mapping
我们也可以通过下方命令手动添加映射关系,
PUT /flight/_mapping
{
"properties": {
"location": {
"type": "geo_point"
}
}
}
请注意,一旦创建了字段映射,就不能对其进行修改。 唯一的方法是删除并重新创建索引。
在下面的示例中,我们手动创建了各种禁用动态映射的映射。
PUT /flight/_mapping
{
"dynamic": false,
"properties": {
"Rcvr": {
"type": "integer"
},
"Icao": {
"type": "text"
},
...
"location": {
"type": "geo_point"
}
}
}
如果你更新了映射,请在禁用动态映射的情况下发出以下查询来更新ElasticSearch,
POST /flight/_update_by_query?conflicts_proceed
在这部分,我重点介绍了如何使用ElasticSearch的常用功能。
在下一一部分中,我们将学习如何在将json文件转换为ElasticSearch的批量API所需的格式之后,以及通过使用JSON库解析json文件,并将批处理json文件导入到ElasticSearch中。
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: wxii2p22