从初学者的角度学习Elasticsearch的Rest API
本文是2015年Elasticsearch圣诞日历第5天的文章。
很抱歉我更新文章很慢。
首先
大家是用什麼工具來檢視和分析Elasticsearch的數據呢?
除了Elasticsearch Head和Kibana等工具外,在處理多個位於不同環境的Elasticsearch或在開發階段探索性工作時,直接使用REST API可以節省不少時間和精力。
因为我自己目前使用的是Elasticsearch已经有两个月了,
所以目前来说,POSTMAN是最强大的Elasticsearch客户端。
2016/06/17最新情报是,Sense是最强的。
中文可以这样翻译:所以我整理了我经常使用的API列表。
参考下列公式API列表
版本信息
Elasticsearch 1.5.2
Elasticsearch 1.5.2 弹性搜索 1.5.2
1. Elasticsearch的健康检查
首先,在引入Elasticsearch之后,我认为第一件要做的事情是启动Elasticsearch(这是理所当然的)。
可以进行启动状态和版本的确认。
$ curl -XGET 'localhost:9200/'
地图制作
在数据库中创建数据结构(类似于MySQL中的数据库和表)。
由于在开发阶段反复创建和取消索引,所以经常调用此API。
在mappings中指定要创建的Type(表)和Fields(列)。
这只是一个简单的例子,如果只是创建索引,则不需要设置。
$ curl -XPOST 'localhost:9200/[index]?pretty' -d '
{
"settings": {
"index": {
"creation_date": "1445580000000",
"uuid": "xxxxxxxxxxxxxxxxxxxxxx",
"number_of_replicas": "1",
"number_of_shards": "5",
"version": {
"created": "1050299"
}
}
},
"mappings": {
"[type]": {
"properties": {
"id": {
"type": "long"
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
},
"created_at": {
"format": "dateOptionalTime",
"type": "date"
}
"updated_at": {
"format": "dateOptionalTime",
"type": "date"
}
}
}
}
}'
可以通过以下的API来确认映射结果,并返回各分片内索引的情况等信息。
$ curl -XGET 'localhost:9200/[index]'
若要进行Index的详细状态检查,请在URL末尾添加 _status。
$ curl -XGET 'localhost:9200/[index]/_status'
如果发生错误或有任何更改,请使用以下的API删除重新构建配置。
$ curl -XDELETE 'localhost:9200/[index]
3. 操作文件
文件制作
完成映射后,接下来将数据插入到指定的表中。
如果未指定id,则会设置一个适当的值。
$ curl -XPOST 'localhost:9200/[index]/[type]/[id]?pretty' -d '
{
"last_name":"のび",
"first_name":"のびた",
"height":150,
"weight":40,
"created_at":1406038,
}'
在执行批量插入时,在最后添加”_bulk”标识。
$ curl -XPOST 'localhost:9200/[index]/[type]/_bulk?pretty' -d '
{ "index" : {} }
{ "last_name" : "のはら", "first_name": "ひろし", "age":35, "height":180.0 }
{ "index" : {} }
{ "last_name" : "のはら", "first_name": "みさえ", "age":29, "height":160.2 }
{ "index" : {} }
{ "last_name" : "のはら", "first_name": "しんのすけ", "age":5, "height": 105.9 }
'
在更新文件时,请指定类型和记录ID。
$ curl -XPUT 'localhost:9200/[index]/[type]/[id]?pretty' -d '
{
"first_name":"ひまわり",
"updated_at":14000000
}'
删除文件
$ curl -XDELETE 'localhost:9200/[index]/[type]/[id]'
我终于成功创建了数据。
4. 查询
可以搜索创建的数据。
可以使用default_operator指定And搜索或or搜索。
fields可以多次指定,并且可以使用_all来指定所有字段作为目标。
$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
"query" : {
"simple_query_string" : {
"query": "みなもと ほねかわ",
"fields": ["last_name"],
"default_operator": "or"
}
}
}'
如果您想对文档进行排序并进行搜索,则需要在json中添加sort,并添加要排序的数组。
$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
"query" : {
"simple_query_string" : {
"query": "まるこ さきこ",
"fields": ["first_name"],
"default_operator": "or"
}
},
"sort" : [{ "created_at" : {"order" : "desc", "missing" : "_last"}}]
}'
5. 继续搜索
如果在常规搜索中添加特殊条件,可以使用function_score。
可以为每个搜索条件分配搜索分数的权重,或者使用字段的计算值来评分等等。这是我开始使用Elasticsearch时最令我兴奋的部分!(尽管我还没有完全掌握它)
由于可以编写简单的条件语句,例如通过身高、体重计算BMI值并进行肥胖判定的情况,可以从搜索分数中减去1,如下所示。
$ curl -XGET 'localhost:9200/[index]/[type]/_search?pretty' -d '
{
"query" : {
"function_score" : {
"query" : {
"simple_query_string" : {
"query": "どらえもん Qたろう ころすけ",
"fields": ["first_name"],
"default_operator": "or"
}
},
"boost_mode": "replace",
"script_score" : {
"script" : "weight = doc['weight'].value; height = doc['height'].value; bmi = weight / ((height)*(height)+1);if (bmi >= 25) return _score - 10 else return _score"
}
}
}
}'
-
- fieldの値は doc[‘field名’].value で取得できる
-
- 改行を入れるとエラーになる
-
- script内の式によって値が0未満になった場合エラーになる
- 上記の例の場合returnは無くても最後の値をうまいこととってくれるので不要。(僕は分かりやすくするためにいれています。)
如果function_score不能正常运行的情况下
使用了默认设置的function_score查询时出现错误,我长时间以来一直尝试着调试,以为是JSON格式出错了,但实际上需要在设置中启用function_score。
在 elasticsearch.yml 文件中添加启用脚本的配置,并重新启动 Elasticsearch。
script.groovy.sandbox.enabled: true
RestAPI的通用选项
我已经整理了API,但在这里我们也使用了?pretty等响应选项来使得响应值更易读,还有一些可用来指定响应格式的常用选项,如果也使用这些选项,可以使得确认更加方便。
请参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html
结束
由于 Elasticsearch 仍处于试错阶段,可能存在一些不够成熟的部分。如果有任何错误或建议,请不吝赐教,我会感激不尽。希望能够尽快掌握 Elasticsearch,度过美好的 Elasticsearch 生活。