从初学者的角度学习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 生活。

广告
将在 10 秒后关闭
bannerAds