搜索API
现在让我们从一些简单的搜索开始。运行搜索有两种基本方法:一种是通过REST请求URI发送搜索参数,另一种是通过REST请求主体发送搜索参数。请求主体方法允许您更具表现力,还可以用更可读的JSON格式定义搜索。我们将尝试一个请求URI方法的示例,但在本教程的其余部分中,我们将专门使用请求体方法。
用于搜索的REST API可以从搜索端点访问。此示例返回银行索引中的所有文档:
GET /bank/_search?q=*&sort=account_number:asc&pretty
-------------------------------------------------------
curl -XGET "http://localhost:9200/bank/_search?q=*&sort=account_number:asc&pretty"
我们先分析一下搜索语句。我们正在银行索引中搜索(_search endpoint),q=*参数指示ElasticSearch匹配索引中的所有文档。sort=account_number:asc 参数指示使用每个文档的account_number字段按升序对结果进行排序。同样,pretty参数只告诉elasticsearch返回格式化打印的JSON结果。
响应(部分显示):
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value": 1000,
"relation": "eq"
},
"max_score" : null,
"hits" : [ {
"_index" : "bank",
"_type" : "_doc",
"_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" : "_doc",
"_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执行搜索的时间(毫秒) -
timed_out
– 告诉我们搜索是否超时 -
_shards –告诉我们搜索了多少碎片,以及成功/失败搜索碎片的计数。
-
hits - 搜索结果
-
hits.total - 包含与搜索条件匹配的文档总数信息的对象
· hits.total.value - 总命中计数的值(必须在hits.total.relation上下文中解释)。
· hits.total.relation
- hits.total.value是确切的命中计数,在这种情况下,它等于“eq”或总命中计数的下限(大于或等于),在这种情况下,它等于gte。
- hits.hits - 搜索结果的实际数组(默认为前10个文档)
- hits.sort - 每个结果的排序键的排序值(如果按分数排序,则缺少该值)
hits._score
和max_score
- 暂时忽略这些字段
hits.total的准确性由请求参数track_total_hits控制,当设置为true时,请求将准确跟踪总命中(“relation”:“eq”)。它默认为10000,这意味着总命中数精确跟踪多达10000个文档。您可以通过将track_total_hits显式设置为true强制进行精确计数。有关详细信息,请参阅请求文档。
如下是使用相同搜索结果的 body 请求:
GET /bank/_search
{
"query": {"match_all": {}},
"sort": [
{
"account_number": {
"order": "asc"
}
}
]
}
---------------------------------------
curl -XGET "http://localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'{ "query": {"match_all": {}}, "sort": [ { "account_number": { "order": "asc" } } ]}'
这里的区别在于,我们没有在URI中传递q=*,而是向SearchAPI提供一个JSON风格的查询请求体。我们将在下一节中讨论这个JSON查询。
重要的是要理解,一旦您返回搜索结果,ElasticSearch将完全完成请求,并且不会维护任何类型的服务器端资源或在结果中打开光标。这与许多其他平台(如SQL)形成了鲜明的对比,在这些平台中,最初可能会提前获得查询结果的一部分子集,然后如果希望使用某种有状态的服务器端获取(或翻页)其余结果,则必须继续返回服务器。光标。