Elasticsearch 7.3.0 翻译 - 《Getting started with Elasticsearch》 搜索数据 - 搜索API

本文深入探讨了Elasticsearch的搜索API,介绍了通过REST请求进行搜索的两种方法:使用URI参数和请求主体。详细解析了请求参数的意义,如q=*、sort、pretty等,并展示了如何使用JSON风格的查询请求体进行更高级的搜索操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搜索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)形成了鲜明的对比,在这些平台中,最初可能会提前获得查询结果的一部分子集,然后如果希望使用某种有状态的服务器端获取(或翻页)其余结果,则必须继续返回服务器。光标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值