2.6 对文档的其他操作

除索引文档外,Elasticsearch也提供多种途径对文档进行获取信息、增、删、改、更新等相关操作。

2.6.1 获取指定的文档信息

可以通过GET方法来获取指定文档的详细信息,代码段2.21演示了查看索引weibo下类型文件名为wb且ID号为2的记录信息的方法,注意这里的HTTP方式是GET。

//代码段2.21: 获取指定文档文档信息
    curl -XGET 'http://localhost: 9200/weibo/wb/2'

返回结果如下,包括在_source段中的内容就是文档中的详细内容(含各字段及其内容)。

    {
    "_index": "weibo",                      //索引名
    "_type": "wb",                          //类型名
    "_ID": "2",                             //ID号
    "_version": 1,                          //版本号
    "found": true,
    "_source": {"user": "LiMing",           //详细信息
    "post_date": "2014-10-15T14:12:12",
    "message": "Hello Tom"
    }
    }

除了上面的方法外,还可设置想要显示或屏蔽的结果。代码段2.22演示了关闭_source过滤器后的效果(注: 语句中的问号“?”表示其后是参数;pretty表示返回的结果中显示缩进以方便阅读)。执行上该语句后,在输出的结果中将不再带有source内容。

//代码段2.22: source过滤器
    curl -XGET 'http://localhost:9200/weibo/wb/2?pretty&_source=false'

在下面的代码段2.23中,演示了如何只显示特定字段的方法(此例只显示fields为user的内容):

//代码段2.23: 显示特定字段的方法
    curl -XGET 'http://localhost:9200/weibo/wb/2?pretty&fields=user'

针对上述语句的返回结果将只带有user 这个字段,如下所示:

    {
    "_index": "weibo",
    "_type": "wb",
    "_ID": "2",
    "_version": 1,
    "found": true,
    "fields": {
    "user": [ "LiMing" ]
    }
    }

2.6.2 删除文档中的信息

可以使用DELETE方法来删除文档中的相应信息。执行代码段2.24中的语句,会删除weibo索引中类型文件为wb且ID号为2的信息。

//代码段2.24: 删除指定的文档信息
    curl -XDELETE 'http://localhost:9200/weibo/wb/2'

针对上述语句的返回值如下,表明删除成功:

    {
        "found": true,
        "_index": "weibo",
        "_type": "wb",
        "_ID": "2",
        "_version": 2
    }

2.6.3 数据更新

如果需要对索引文档中的类型或其中的文档进行更新,需要用Elasticsearch提供的UPDATE API来实现。它的处理过程是先取出文档,运行指定的脚本,之后更新文档。下面的代码段2.25是在索引weibo中类型文件名为wb中增加ID为3的文档信息(给定了4个field,即user、post_date、message、like,这里的like字段表示针对此条微博的点赞的数量)。

//代码段2.25: 直接向索引文件中指定的ID中录入信息
    curl-XPUT 'http://localhost:9200/weibo/wb/3'//直接指定ID号,这里的HTTP方法是PUT
    {
        "user": "LiMing",
        "post_date": "2014-10-15T14:12:12",
        "message": "Hello Tim",
        "like": 3
    }

可以通过使用Update API将上述这个文档中的like字段数值增加到4,实现方法如代码段2.26所示。注意这里的ctx._source.表示本文档的内容,ctx._source.like表示文档中某个具体的字段(这里是指like字段),而params是拟使用的新参数值。

//代码段2.26: 通过_update方式更新数据
    curl-XPOST http://localhost:9200/weibo/wb/3/_update
                             //请注意这里的_update,HTTP方法是POST
    {
        "script": "ctx._source.like +=count"
        "params": {
        "count": 4
      }
    }

针对上面的例子,执行完上述语句后的索引数据如图2.6所示。注意字段中的like字段值已经由原先是3变为7。

图2.6 更新like字段后的索引数据

:上面的代码中,“ctx._source.”表示document内容,ctx._source.like表示该document中具体的fields是like字段;params表示为变量赋值为4。图2.6中的结果可以通过语句curl XPUT GET http://localhost:9200/weibo/wb/3命令得到。

上述语句是针对数值型数据的增、删、改操作。类似地,也可以完成对字符型数据的更新。代码段2.27录入了ID号为5的针对索引文件为weibo的类型文件名为wb的部分微博数据字段(user、post_data、message、tags)。

//代码段2.27: 直接向指定的ID中录入信息
    curl-XPOST http://localhost:9200/weibo/wb/5    //注意这里使用的HTTP方法是POST
    {
        "user": "LiMing",
        "post_date": "2014-10-15T14:12:12",
        "message": "Hello Lily",
        "tags": [
                "Hello"
                ]
     }

代码段2.28的作用是修改了上述语句执行结果中的tag信息并增加了新的内容(即在tag中增加了新的内容)。修改后的文档信息如图2.7所示(可通过curl XGET http://localhost:9200/weibo/wb/5命令得到结果)。

//代码段2.28: 通过_update方式更新信息
    curl-XPOST http://localhost:9200/weibo/wb/5/_update    //注意这里的POST方法
        {
        "script": "ctx._source.tags+=tag",
        "params": {
            "tag": "Today is a nice day!"
        }
    }

图2.7 更新tag后的索引数据

由于Elasticsearch处理的文档是非结构化的信息,因此可能与关系型数据库不同,文档中各记录的字段有可能不一样。利用_update,不仅可以像上述那样更新数据,还可以修改文档结构(如只在某一ID的记录上增加新的字段)。代码段2.29在指定的文档中增加新的字段,而这个新的字段的名字是name_of_new_field,其值是new_field,注意这里对引号需转义处理。

//代码段2.29: 通过update方式修改文档结构并增加新的字段
    curl-XPOST http://localhost:9200/weibo/wb/5/_update
    {
        "script": "ctx._source.name_of_new_field=\"new_field\""
    }

代码段2.30表示在使用_update参数时,如果该记录(即指定的ID号,此例中是7)不存在,则通过参数体中的upsert创建这个文档,并且加入新的字段(其名为counter,其值为1);如果有该记录(即指定的ID号,例子中是7),就把指定字段like的值增加4(在代码中的params中表明拟增加的偏移量)。

//代码段2.30: 通过update方式修改document结构
    curl-XPOST http://localhost:9200/weibo/wb/7/_update
    {
        "script": "ctx._source.like+=count",
        "params": {
            "count": 4
        },
        "upsert": {
            "counter": 1
        }
    }

2.6.4 基于POST方式批量获取文档

Elasticsearch支持一次操作多条记录。代码段2.31可返回ID号为5和7的记录信息,注意语句中的_mget参数的使用。

//代码段2.31: 基于POST方式批量获取文档
    curl-XPOST http://localhost:9200/weibo/wb/_mget?
    {
      "docs": [
        {
          "_index": "weibo",
          "_type": "wb",
          "_ID": "5"
        },
        {
          "_index": "weibo",
          "_type": "wb",
          "_ID": "7"
        }
      ]
    }

针对代码段2.31的返回结果如图2.8所示。

图2.8 基于POST方式批量获取文档数据

在代码中也可使用_source过滤器。代码段2.32只获取其中的一个文档信息。

//代码段2.32: 使用_source过滤器获取文档
    curl-XPOST  'localhost:9200/_mget?pretty' -d '{
        "docs": [
                   { "_index": "weibo",
                      "_type": "wb",
                      "_ID": "3",
                      "_source": false
                   }
              ]
    }'

针对上述语句的返回值如下:

    {    "docs": [ {
        "_index": "weibo",
        "_type": "wb",
        "_ID": "3",
        "_version": 1,
        "found": true
        } ]
    }

2.6.5 删除部分文档

可以通过联合使用_query方法和DELETE API,将命中的文档中的部分或全部内容删除。代码段2.33检索到用户名为LiMing的文档,之后通过DELETE方法将其删除。

//代码段2.33: 删除文档LiMing
    curl -XDELETE 'http://localhost:9200/weibo/wb/_query?q=user:LiMing'