Elasticsearch初步使用案例

Elasticsearch的使用数据库

接下来,咱们看看如何创建索引、建立文档等,就比如在 MySQL 中进行诸如建立数据库,插入数据等操做。服务器

Index:建立与更新索引curl

在ElasticSearch中,Index这一动做类比于CRUD中的Create与Update,当咱们尝试为某个不存在的文档创建索引时,会自动根据其相似于ID建立新的文档,不然就会对原有的文档进行修改。ui

ElasticSearch使用PUT请求来进行Index操做,你须要提供索引名称、类型名称以及可选的ID,格式规范为:http://localhost:9200//[]。其中索引名称能够是任意字符,若是ElasticSearch中并不存在该索引则会自动建立。url

添加文档
下面,咱们将建立一个存储电影信息的Document :spa

  • Index 的名称为movie
  • Type 的名称为adventure
  • Document 有两个字段: name和actors

咱们使用 Elasticsearch 提供的 RESTful API 来执行上述操做,如图所示:code

image.png

  • url 表示一个资源,好比 /movie/adventure/1 就表示一个 indexmovietypeadventureid 1document
  • http 方法操做资源,如使用 GET 获取资源,使用 POST、PUT 新增或更新资源,使用 DELETE 删除资源等

向指定的 /Index/Type 发送 PUT 请求,就能够在 Index 里面新增一条记录。好比,向/movie/adventure发送请求,就能够新增电影记录。对象

咱们可使用 curl 命令来执行上述操做:索引

curl -XPUT "http://localhost:9200/movie/adventure/1" -d '
{
    "name": "Life of Pi",
    "actors": ["Suraj" , "Irrfan"]
}'

若是能够,推荐使用httpie,相似 curl,但比 curl 更好用,将上面的命令换成 httpie,以下:资源

http put :9200/movie/adventure/1 name="Life of Pi" actors:='["Suraj", "Irrfan"]'

服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息。
成功返回的结果:

{
    "_index": "movie",
    "_type": "adventure",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}

能够看到,咱们已经成功建立了一个 _indexmovie_typeadventure_id 为 1 的文档,最后的1是该条记录的 Id。它不必定是数字,任意字符串(好比abc)均可以。

ElasticSearch对于PUT请求的响应中包含了是否操做成功、文档编号等信息。

GET
咱们经过 GET 请求来查看这个文档的信息:

curl -XGET localhost:9200/movie/adventure/1

结果以下:

{
    "_index": "movie",
    "_type": "adventure",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "name": "Life of Pi",
        "actors": [
            "Suraj",
            "Irrfan"
        ]
    }
}

能够看到,原始的文档数据存在了 _source 字段中。

新增记录的时候,也能够不指定 Id,这时要改为 “POST” 请求。

curl -X POST 'localhost:9200/movie/adventure' -d '
{
  "name": "Life of Pi"
}'

更新整个文档
更新记录就是使用 PUT 请求,从新发送一次数据。不过咱们此次务必要加上须要修改的文档的ID编号,不然就变成添加了。接下来咱们尝试对刚才新创建的文档进行些修改,添加某些关键字属性。

当咱们使用 PUT 方法指明文档的 _index, _type _id时,若是 _id 已存在,则新文档会替换旧文档,此时文档的 _version 会增长 1,而且 _created 字段为 false。好比:

curl -XPUT "http://localhost:9200/movie/adventure/1" -d'
{
    "name": "Life of Pi"
}'

返回的结果:

{
    "_index": "movie",
    "_type": "adventure",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": false
}

添加和修改的比较
对于此操做的ElasticSearch的响应与前者很相似,不过能够看出_version属性值已经发生了变化:

变化的字段 添加 修改
_version 1 2
result created updated
created true false

GET
最简单的获取某个文档的方式便是基于文档ID进行搜索

curl -XGET 'http://localhost:9200/movie/adventure/1?pretty=true'

返回的结果:

{
  "_index" : "movie",
  "_type" : "adventure",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "name" : "Life of Pi"
  }
}

能够看到,actors 这个字段已经不存在了,文档的 _version 变成了 2。

如何避免原文档被替换?

所以,为了不在误操做的状况下,原文档被替换,咱们可使用 _create 这个 API,表示只在文档不存在的状况下才建立新文档(返回 201 Created),若是文档存在则不作任何操做(返回 409 Conflict),命令以下:

curl -XPUT "http://localhost:9200/movie/adventure/1/_create" -d'
{                       
    "name": "Life of Pi"
}'

因为文档 id 存在,会返回 409 Conflict。结果以下:

{
    "error": {
        "root_cause": [
            {
                "type": "version_conflict_engine_exception",
                "reason": "[adventure][1]: version conflict, document already exists (current version [2])",
                "index_uuid": "Kn_OWg1TT5GLaMInWlREHQ",
                "shard": "3",
                "index": "movie"
            }
        ],
        "type": "version_conflict_engine_exception",
        "reason": "[adventure][1]: version conflict, document already exists (current version [2])",
        "index_uuid": "Kn_OWg1TT5GLaMInWlREHQ",
        "shard": "3",
        "index": "movie"
    },
    "status": 409
}

局部更新
在有些状况下,咱们只想更新文档的局部,而不是整个文档,这时咱们可使用 _update 这个 API。

如今,待更新的文档信息以下:

{
  "_index" : "movie",
  "_type" : "adventure",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "name" : "Life of Pi"
  }
}

最简单的 update 请求接受一个局部文档参数 doc,它会合并到现有文档中,请求方式须要变动为POST方式:将对象合并在一块儿,存在的标量字段被覆盖,新字段被添加。

curl -XPOST "http://localhost:9200/movie/adventure/1/_update" -d'
{
    "doc": {
      "name": "life of pi",
      "actor": ["jack"]
   }
}'

上面的命令中,咱们添加了一个新的字段:actors,结果以下:

{
  "_index" : "movie",
  "_type" : "adventure",
  "_id" : "1",
  "_version" : 8,
  "found" : true,
  "_source" : {
    "name" : "life of pi",
    "actor" : [
      "jack"
    ]
  }
}

Delete:删除索引
如今咱们尝试去删除上文中插入的部分文档,对于要删除的文档一样须要传入索引名、类型名与文档名这些信息,譬如:

curl -XDELETE "http://localhost:9200/movie/adventure/1"

返回的结果:

{
    "found": true,
    "_index": "movie",
    "_type": "adventure",
    "_id": "1",
    "_version": 3,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    }
}

在咱们删除了该文档以后,再次尝试用GET方法获取该文档信息时,会获得以下的响应:

{
  "_index" : "movie",
  "_type" : "adventure",
  "_id" : "1",
  "found" : false
}

查看当前节点的全部 Index

http://localhost:9200/_cat/indices?v

返回的结果:

health status index       uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   my_index    aBM6KLOLSJ6TWtp87sC5qA   5   1          1            0      4.1kb          4.1kb
yellow open   accounts    2i3MNbwCSeSxZCBDikaMzA   5   1          2            0      7.9kb          7.9kb
yellow open   movies      -uB5sD6QTt6vmD4YPpJFaQ   5   1          1            0      5.1kb          5.1kb
yellow open   liuxingwang 6KRPO9fJRVmWC7X3G69HQQ   5   1          0            0       955b           955b

小结

  • Elasticsearch 经过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
  • 在建立文档时,咱们能够用 POST 方法指定将文档添加到某个 _index/_type 下,来让 Elasticsearch自动生成惟一的 _id
  • 而用 PUT 方法指定将文档的 _index/_type/_id
  • 咱们看不到HTTP头是由于咱们没有让curl显示它们,若是要显示,使用curl命令后跟-i参数。
相关文章
相关标签/搜索