多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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**(光标)来抓取(或者通过分页)其它的结果,然后您必须再次回到服务器。