简易 查询 —query-string search— 对于用命令行进行即席查询(ad-hoc)是非常有用的。然而,为了充分利用查询的强大功能,你应该使用 请求体 search
API, 之所以称之为请求体查询(Full-Body Search),因为大部分参数是通过 Http 请求体而非查询字符串来传递的。
请求体查询 —下文简称 查询—不仅可以处理自身的查询请求,还允许你对结果进行片段强调(高亮)、对所有或部分结果进行聚合分析,同时还可以给出 你是不是想找 的建议,这些建议可以引导使用者快速找到他想要的结果。
让我们以最简单的 search
API 的形式开启我们的旅程,空查询将返回所有索引库(indices)中的所有文档:
GET /_search
{} (1)
-
这是一个空的请求体。
只用一个查询字符串,你就可以在一个、多个或者 _all
索引库(indices)和一个、多个或者所有types中查询:
GET /index_2014*/type1,type2/_search
{}
同时你可以使用 from
和 size
参数来分页:
GET /_search
{
"from": 30,
"size": 10
}
某些特定语言(特别是 JavaScript)的 HTTP 库是不允许 GET
请求带有请求体的。事实上,一些使用者对于 GET
请求可以带请求体感到非常的吃惊。
而事实是这个RFC文档 RFC 7231— 一个专门负责处理 HTTP 语义和内容的文档 — 并没有规定一个带有请求体的 GET
请求应该如何处理!结果是,一些 HTTP 服务器允许这样子,而有一些 — 特别是一些用于缓存和代理的服务器 — 则不允许。
对于一个查询请求,Elasticsearch 的工程师偏向于使用 GET
方式,因为他们觉得它比 POST
能更好的描述信息检索(retrieving information)的行为。然而,因为带请求体的 GET
请求并不被广泛支持,所以 search
API同时支持 POST
请求:
POST /_search
{
"from": 30,
"size": 10
}
类似的规则可以应用于任何需要带请求体的 GET
API。
我们将在聚合 [aggregations] 章节深入介绍聚合(aggregations),而现在,我们将聚焦在查询。
相对于使用晦涩难懂的查询字符串的方式,一个带请求体的查询允许我们使用 查询领域特定语言(query domain-specific language) 或者 Query DSL 来写查询语句。