Elasticsearch API 使用介绍

2018-01-02 10:36:44 浏览数 (1)

API文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

Index API

索引API在特定索引中添加或更新类型化的JSON文档,使其可搜索。以下示例将JSON文档插入到“twitter”索引中,名为“tweet”的类型,ID为1:

代码语言:javascript复制
curl -XPUT '192.168.0.56:9200/twitter/tweet/1?pretty' -d'
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}'

上述索引操作的结果是:

代码语言:javascript复制
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : true
}

_shards头提供有关索引操作的复制过程的信息。

  • total - 指示应对多少分片副本(主分片和副本分片)执行索引操作。
  • success-指示索引操作成功的分片副本数。
  • failed - 在索引操作在副本碎片上失败的情况下包含与复制相关的错误的数组。 索引操作成功的情况下成功至少为1。

自动索引创建

如果索引操作尚未创建,则索引操作自动创建索引(检出用于手动创建索引的create index API),并且如果尚未创建,则自动为特定类型创建动态类型映射(检出put映射API用于手动创建类型映射)。 映射本身非常灵活,并且是无模式的。新字段和对象将自动添加到指定类型的映射定义。查看映射部分以获取有关映射定义的更多信息。 可以通过设置操作来禁用自动创建索引。 auto_create_index在所有节点的配置文件中为false。可以通过设置索引来禁用自动映射创建。映射器。动态到每个索引作为索引设置。 自动索引创建可以包括基于模式的白/黑列表,例如,设置操作。 auto_create_index to aaa , - bbb , ccc*, - *(意味着允许 ,意味着不允许-)。

索引版本

每个索引文档都有一个版本号。相关的版本号作为对索引API请求的响应的一部分返回。索引API可选地允许在指定version参数时进行乐观并发控制。这将控制要对其执行操作的文档的版本。一个用于版本控制的用例的好例子是执行事务读取然后更新。从初始读取的文档指定版本可以确保在此期间没有发生更改(当为了更新而读取时,建议将偏好设置为_primary)。例如:

代码语言:javascript复制
url -XPUT '192.168.0.56:9200/twitter/tweet/1?version=2&pretty' -d'
{
    "message" : "elasticsearch now has versioning support, double cool!"
}'
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : false
}

注: 这里更改索引文档版本号时,先确认当前索引版本号,put制定的version等于当前版本号

索引类型

在上面解释的内部*外部版本类型旁边,Elasticsearch还支持特定用例的其他类型。这里是不同版本类型及其语义的概述。

  • internal 仅当给定版本与存储的文档的版本相同时才索引文档。
  • external或external_gt 仅在给定版本严格高于所存储文档的版本或如果没有现有文档时索引文档。给定版本将用作新版本,并与新文档一起存储。提供的版本必须是非负长数字。
  • external_gte 仅在给定版本等于或高于存储文档的版本时索引文档。如果没有现有文档,操作也将成功。给定版本将用作新版本,并与新文档一起存储。提供的版本必须是非负长数字。

自动ID生成

可以在不指定id的情况下执行索引操作。在这种情况下,将自动生成id。此外,op_type将自动设置为create。这里是一个例子(注意POST使用,而不是PUT):

代码语言:javascript复制
curl -XPOST '192.168.0.56:9200/twitter/tweet/?pretty' -d'
> {
>     "user" : "kimchy",
>     "post_date" : "2009-11-15T14:12:12",
>     "message" : "trying out Elasticsearch"
> }'
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "AVmA9WQ8kc6yr5hbEKZd",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : true
}

索引timeout

执行索引操作时分配的主分片可能不可用。这种情况的一些原因可能是主分片当前正在从网关恢复或正在进行重定位。默认情况下,索引操作将在主分片上等待最多1分钟,然后失败并响应错误。 timeout参数可以用于显式指定等待时间。以下是将其设置为5分钟的示例:

代码语言:javascript复制
curl -XPUT '192.168.0.56:9200/twitter/tweet/1?timeout=5m&pretty' -d'
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}'

# 回显
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 4,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : false
}

获取API

et API允许从索引根据其id获取一个类型化的JSON文档。以下示例从名为twitter的索引(名为tweet)下获取JSON文档,id为0:

代码语言:javascript复制
curl -XGET 'localhost:9200/twitter/tweet/1?pretty'

显示结果:

代码语言:javascript复制
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
  }
}

以上结果包括我们希望检索的文档的_index,_type,_id和_version,包括文档的实际_source(如果响应中的found字段指示)。

API还允许使用HEAD检查文档的存在,例如:

代码语言:javascript复制
curl -XHEAD 'localhost:9200/twitter/tweet/0?pretty'

过滤source

默认情况下,get操作返回_source字段的内容,除非已使用stored_fields参数或禁用_source字段。您可以使用_source参数关闭_source检索:

代码语言:javascript复制
curl -XGET 'localhost:9200/twitter/tweet/0?_source=false&pretty'

如果只需要完整的_source中的一个或两个字段,则可以使用_source_include&_source_exclude参数来包含或过滤出所需的部分。这对于大文档特别有用,其中部分检索可以节省网络开销。两个参数都以逗号分隔的字段或通配符表达式列表。例:

代码语言:javascript复制
curl -XGET 'localhost:9200/twitter/tweet/1?_source_include=*.id&_source_exclude=user&pretty'

删除API

删除API允许从基于其id的特定索引中删除键入的JSON文档。以下示例从名为twitter的索引(名为tweet)下删除JSON文档,其id为1:

代码语言:javascript复制
 curl -XDELETE 'http://localhost:9200/twitter/tweet/1'
{"found":true,"_index":"twitter","_type":"tweet","_id":"1","_version":6,"result":"deleted","_shards":{"total":2,"successful":2,"failed":0}}

更新API

更新API允许基于提供的脚本更新文档。操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并将结果返回索引(也允许删除或忽略操作)。它使用版本控制来确保在“get”和“reindex”期间没有发生更新。 注意,这个操作仍然意味着文档的完整的索引,它只是删除一些网络往返,并减少get和索引之间的版本冲突的机会。需要启用_source字段才能使此功能正常工作。 例如,让索引一个简单的文档:

代码语言:javascript复制
curl -XPUT 'localhost:9200/test/type1/1?pretty' -d'
{
    "counter" : 1,
    "tags" : ["red"]
}'

现在,我们可以执行一个脚本来增加计数器

代码语言:javascript复制
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -d'
{
    "script" : {
        "inline": "ctx._source.counter  = params.count",
        "lang": "painless",
        "params" : {
            "count" : 4
        }
    }
}'

我们可以在标签列表中添加一个标签(注意,如果标签存在,它仍然会添加它,因为它的列表)

代码语言:javascript复制
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -d'
{
    "script" : {
        "inline": "ctx._source.tags.add(params.tag)",
        "lang": "painless",
        "params" : {
            "tag" : "blue"
        }
    }
}'

除了_source,通过ctx映射可以使用以下变量:_index,_type,_id,_version,_routing,_parent和_now(当前时间戳)。 我们还可以向文档中添加一个新字段:

代码语言:javascript复制
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -d'
{
    "script" : "ctx._source.remove("new_field")"
}'

而且,我们甚至可以更改执行的操作。如果标记字段包含绿色,此示例将删除文档,否则不执行任何操作(noop):

代码语言:javascript复制
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -d'
{
    "script" : {
        "inline": "if (ctx._source.tags.contains(params.tag)) { ctx.op = "delete" } else { ctx.op = "none" }",
        "lang": "painless",
        "params" : {
            "tag" : "green"
        }
    }
}'
  • 使用部分文档的更新

更新API还支持传递部分文档,这将被合并到现有文档中(简单递归合并,内部合并对象,替换核心“键/值”和数组)。例如:

代码语言:javascript复制
curl -XPOST 'localhost:9200/test/type1/1/_update?pretty' -d'
{
    "doc" : {
        "name" : "new_name"
    }
}'

Multi GET API

多GET API允许基于索引,类型(可选)和id(可能路由)获取多个文档。该响应包括具有所有提取的文档的docs数组,每个元素在结构上类似于由get API提供的文档。这里是一个例子:

代码语言:javascript复制
curl 'localhost:9200/_mget' -d '{
    "docs" : [
        {
            "_index" : "test",
            "_type" : "type",
            "_id" : "1"
        },
        {
            "_index" : "test",
            "_type" : "type",
            "_id" : "2"
        }
    ]
}'

0 人点赞