elasticsearch(2) 数据操作——查询

一 文档

ES面向文档,并且使用JSON作为文档序列化格式,对于ES来说,文档特指根对象序列化成的JSON数据,以唯一ID标识并存储于ES中。

  • 文档元数据

三个必须的元数据节点

1、_index      文档存储的地方

索引类似于关系数据库中的数据库,它是我们存储和索引关联数据的地方

2、_type       文档代表的对象的类

类似于关系型数据库中的表,每个类型都有自己的映射或者结构定义

3、_id           文档的唯一标识

与_index和_type组合可以在ES中唯一标识一个文档,可以自定义,也可以由ES自动生成

 

二 索引

1、使用自己的id

需要自己指定id,请求方式为PUT

示例:

请求  PUT  127.0.0.1:9200/{index}/{type}/{id}   (这里取index为test,type 为test, id 为3)

参数:JSON数据

响应:

{
  "_index": "test",
  "_type": "test",
  "_id": "3",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

可以看到响应中的_id与自己设置的一致  

 

2、使用自增id

无需自己指定id,请求方式为POST

示例

请求  POST  127.0.0.1:9200/{index}/{type}    (这里取index为test,type 为test)

参数:JSON数据

响应:

{
  "_index": "test",
  "_type": "test",
  "_id": "WOTj8GYBuXRyDW5PpvRN",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

可以看到使用自增id,ES会随机生成一个uuid作为文档的id  

 

三 获取文档

1、检索文档

想要从Elasticsearch中获取文档,我们使用同样的_index_type_id,但是HTTP方法改为GET

示例:

GET  127.0.0.1:9200/test/test/4

响应

{
  "_index": "test",
  "_type": "test",
  "_id": "4",
  "_version": 2,
  "found": true,
  "_source": {
    "hello": "world",
    "author": "wuzhe"
  }
}

  

响应中的_source 即我们放入的文档内容

found 表示文档存在

若检索一个不存在的文档,则响应为

{
  "_index": "test",
  "_type": "test",
  "_id": "5",
  "found": false
}

这时 found变成了false  

2、检索部分文档

通常,GET请求将返回文档的全部,存储在_source参数中。但是可能你感兴趣的字段只是title。请求个别字段可以使用_source参数。多个字段可以使用逗号分隔:

示例

GET  127.0.0.1:9200/test/test/4?_source=hello

响应

{
  "_index": "test",
  "_type": "test",
  "_id": "4",
  "_version": 2,
  "found": true,
  "_source": {
    "hello": "world"
  }
}

这样就只能看到hello对应的内容了  

 

3、检查文档是否存在

如果你想做的只是检查文档是否存在,对内容完全不感兴趣,可以使用HEAD方法来代替GET

HEAD  127.0.0.1:9200/test/test/4

响应

若存在 状态码status为200

若不存在 状态码status为404

 

4、检索多个文档

如果想要查询多个文档,ES提供了一个mget API可以将多次检索合并,避免了一次次检索的请求网络时间

mget API参数是一个docs数组,数组的每个节点定义一个文档的_index_type_id元数据。如果你只想检索一个或几个确定的字段,也可以定义一个_source参数:

示例 :  POST 127.0.0.1:9200/_mget
请求参数:

{
   "docs" : [
      {
         "_index" : "test",
         "_type" :  "test",
         "_id" :    3
      },
      {
         "_index" : "test",
         "_type" :  "test",
         "_id" :    4,
         "_source": "hello"
      },
      {
         "_index" : "test",
         "_type" :  "test",
         "_id" :    5
      }
   ]
}

响应

{
  "docs": [
    {
      "_index": "test",
      "_type": "test",
      "_id": "3",
      "_version": 1,
      "found": true,
      "_source": {
        "first_name": "John",
        "last_name": "Smith",
        "age": 25,
        "about": "I love to go rock climbing",
        "interests": [
          "sports",
          "music"
        ]
      }
    },
    {
      "_index": "test",
      "_type": "test",
      "_id": "4",
      "_version": 2,
      "found": true,
      "_source": {
        "hello": "world"
      }
    },
    {
      "_index": "test",
      "_type": "test",
      "_id": "5",
      "found": false
    }
  ]
}

 

可以看到响应体也包含一个docs数组,每个文档还包含一个响应,它们按照请求定义的顺序排列。每个这样的响应与单独使用get request响应体相同。
可以看到第三个文档不存在,但这不影响第一第二个文档的检索,每个文档的检索和报告都是独立的。


如果你想检索的文档在同一个_index中(甚至在同一个_type中),你就可以在URL中定义一个默认的/_index或者/_index/_type

你依旧可以在单独的请求中使用这些值:

POST /test/test/_mget
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "newtest", "_id" :   1 }
   ]
}

事实上,如果所有文档具有相同_index_type,你可以通过简单的ids数组来代替完整的docs数组:

POST /test/test/_mget
{
   "ids" : [ "2", "1" ]
}
 

 

  

 

转载于:https://www.cnblogs.com/wuzhe1991/p/9921744.html

你可能感兴趣的:(elasticsearch(2) 数据操作——查询)