查询分两种,一种把查询条件写在一个字符串里,即 URI Request
,一种则把查询条件写在一个查询文本中,即 request body
一个查询请求可以通过一个 URI 来完成,用 URI 的方式来查询的话,查询条件就集成在了 URI 中。这种方式有一定的局限性,但是优点在于轻便。
例如,查询name=pasta
的商品:
GET /products/_search/?q=name:pasta
Query String也可以写在JSON请求中,这种方式和?q=name:pasta
是等价的:
GET /products/_search
{
"query": {
"query_string": {
"query": "name:pasta"
}
}
}
URI型的查询还支持布尔(AND / OR / NOT 或者 && / || / !
)操作, 注意这些操作符必须大写 ,例如获取name=pasta
和price=75
的商品:
GET /products/_search?q=name:pasta AND price:75
当然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
。
在查询文档里,返回的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 将会返回已经成功从每个分片获取的结果。 |