The Search API(搜索 API)

现在让我们从一些简单的搜索开始。这里两个运行搜索的基本方法 : 一个是通过使用 REST request URI  发送搜索参数,另一个是通过使用  REST request body 来发送它们。请求体的方法可以让您更具有表现力,并且可以在一个更可读的 JSON 格式中定义您的搜索。我们会尝试使用一个 REST request URI 的示例,但是在本教程的其它部分,我们将只使用 REST request body 的方法。

搜索的 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":"[email protected]","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":"[email protected]","city":"Brogan","state":"IL"}
    }, ...
    ]
  }
}

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

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

这里是上面相同的搜索,使用了 REST request body 方法 : 

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(光标)来抓取(或者通过分页)其它的结果,然后您必须再次回到服务器。