# The Search API（搜索 API）

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_the_search_api.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_the_search_api.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260748](http://www.apache.wiki/pages/viewpage.action?pageId=4260748)

贡献者 : [那伊抹微笑](/display/~wangyangting)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

现在让我们从一些简单的搜索开始。这里两个运行搜索的基本方法 : 一个是通过使用 [REST request URI](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-uri-request.html "URI Search")  发送搜索参数，另一个是通过使用  [REST request body](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-body.html "Request Body Search") 来发送它们。请求体的方法可以让您更具有表现力，并且可以在一个更可读的 **JSON** 格式中定义您的搜索。我们会尝试使用一个 [REST request URI](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-uri-request.html "URI Search") 的示例，但是在本教程的其它部分，我们将只使用 [REST request body](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-body.html "Request Body Search") 的方法。

搜索的 **REST API** 从 **_search** 的尾部开始。这个示例返回了 **bank** 索引中的所有文档 : 

```
curl -XGET 'localhost:9200/bank/_search?q=*&sort=account_number:asc&pretty'
```

首先让我们切开搜索的调用。我们在 **bank** 索引中执行搜索（**_search** 尾部），然后 **q=*** 参数命令 **Elasticsearch** 去匹配索引中所有的文档。**pretty** 参数，再一次告诉 **Elasticsearch** 去返回打印漂亮的 **JSON** 结果。

响应如下（部分）: 

```
{
  "took" : 63,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1000,
    "max_score" : null,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "0",
      "sort": [0],
      "_score" : null,
      "_source" : {"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"}
    }, {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "1",
      "sort": [1],
      "_score" : null,
      "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}
```

在响应中，我们可以看到以下几个部分 : 

*   **took** - **Elasticsearch** 执行搜索的时间（毫秒）
*   **time_out** - 告诉我们搜索是否超时
*   **_shards** - 告诉我们多少个分片被搜索了，以及统计了成功/失败的搜索分片
*   **hits** - 搜索结果
*   **hits.total** - 搜索结果
*   **hits.hits** - 实际的搜索结果数组（默认为前 **10** 的文档）
*   **sort** - 结果的排序 **key**（键）（没有则按 **score** 排序）
*   _**score**_ 和**max_score** -现在暂时忽略这些字段

这里是上面相同的搜索，使用了 [REST request body](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-body.html "Request Body Search") 方法 : 

```
curl -XGET 'localhost:9200/bank/_search?pretty' -d'
{
  "query": { "match_all": {} },
  "sort": [
    { "account_number": "asc" }
  ]
}'
```

这里不同的地方是而不是在 **URL** 中传递 **q=*** ，我们 **POST** 一个 **JSON** 风格的查询请求体到 **_search** **API**。我们将在下一部分讨论这个 **JSON** 查询。

需要了解，一旦您搜索的结果被返回，**Elasticsearch** 完成了这次请求，并且不会维护任何服务端的资源或者结果的 **cursor**（游标）。这与其它的平台形成了鲜明的对比，例如 **SQL**，您可能首先获得查询结果的子集，如果您想要使用一些服务端有状态的 **cursor**（光标）来抓取（或者通过分页）其它的结果，然后您必须再次回到服务器。