URI型查询与Request body型查询

查询分两种,一种把查询条件写在一个字符串里,即 URI Request ,一种则把查询条件写在一个查询文本中,即 request body

URI型的查询方式

一个查询请求可以通过一个 URI 来完成,用 URI 的方式来查询的话,查询条件就集成在了 URI 中。这种方式有一定的局限性,但是优点在于轻便。

例如,查询name=pasta的商品:

GET /products/_search/?q=name:pasta

image-20220716160800742

Query String也可以写在JSON请求中,这种方式和?q=name:pasta是等价的:

GET /products/_search
{
  "query": {
    "query_string": {
      "query": "name:pasta"
    }
  }
}

image-20220716160906397

URI型的查询还支持布尔(AND / OR / NOT 或者 && / || / !)操作, 注意这些操作符必须大写 ,例如获取name=pastaprice=75的商品:

GET /products/_search?q=name:pasta AND price:75

image-20220716161104103

当然URL型的查询还支持很多特性,比如指定范围查询、通配符查询等,这里不再详细介绍,感兴趣可以参考 https://blog.csdn.net/xixihahalelehehe/article/details/109453253

除了使用 URI 来发起一个查询请求,你也可以使用一个包含着 Query DSL 的 DSL 来进行查询,就像下面这样:

GET /products/_search
{
  "query": {
    "match": {
      "name": "pasta"
    }
  }
}

上面的查询等价于GET /products/_search/?q=name:pasta

image-20220716162109978

查询结果字段的说明

image-20220716162531327

在查询文档里,返回的JSON结果中包含很多字段,这些字段的说明如下:

字段 说明
hits 返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档(默认是十个,可以进行配置)。
hits 数组中每个结果包含文档的 _index_type_id ,加上 _source 字段。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。
max_score max_score 值是与查询所匹配文档的 _score 的最大值。
took took 值告诉我们执行整个搜索请求耗费了多少毫秒。
shard _shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timeout timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,你可以指定 timeout 为 10 或者 10ms(10毫秒):GET /_search?timeout=10ms, 在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。