Search API 查询主要有两种方式:
- URI Search:
- 操作简便,可以通过命令行操作;
- 仅包含部分查询语法
- Request Body Search:
- ES 提供了完整的查询语法 Query DSL
# URI Search
Get my_index/_doc/_search?q=user:tom
# Query DSL
Get my_index/_doc/_search
{
"query": {
"term": {
"user": "tom"
}
}
}
1 URI Search
通过 URI Search 参数来实现搜索,常见的参数有:
- q:指定查询语句
- df:q 中不指定字段时默认的查询字段,如果不指定,ES 则会查询所有字段
- sort:排序
- timeout:指定超时时间,默认不超时
- from,size:用于分页
- _source:返回结果字段,可以设置_source_include 和 _source_exclude
# URI Search 查询my_index 索引中user字段包含tom 的文档
# 按 age 降序排列,返回5~14 个文档,超时1s
GET my_index/_doc/search?q=tom&df=user&sort=age:desc&from=4&size=10&timeout=1s
2 Request Body Search
2.1 query 搜索
GET twitter/_doc/_search
{
"query" : {
"term" : { "user" : "kimchy" }
}
}
2.2 sort 排序
允许在特定字段上添加一个或多个排序,每个排序也可以颠倒。 排序是在每个字段级别上定义的,具有 _score 的特殊字段名称按分数排序,_doc 按索引顺序排序。
GET /my_index/_search
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
"user",
{ "name" : "desc" },
{ "age" : "desc" },
"_score"
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
注:_doc 除了是最有效的排序顺序没有真正的用例。所以如果你不关心文档返回的顺序,那么你应该按 _doc 排序。 这特别有助于滚动。
sort order 可以进行 asc 升序排序 和 desc 降序排序,在对 _score 进行排序时,该顺序默认为 desc,在对其他事物进行排序时默认为 asc。
sort mode option Elasticsearch支持按数组或多值字段排序。 mode 选项控制选择用于对其所属文档进行排序的数组值。 mode 选项可以具有以下值:
- min:选择最小值
- max:选择最大值
- sum:使用所有值的和作为排序值
- avg:使用所有值的平均值作为排序值
- median:使用所有值的中值作为排序值,仅适用于数组。
PUT /my_index/_doc/1?refresh
{
"product": "chocolate",
"price": [20, 4]
}
POST /_search
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{"price" : {"order" : "asc", "mode" : "avg"}}
]
}
2.3 explain 解释
启用每次匹配对其评分计算方式的说明。
GET /_search
{
"explain": true,
"query" : {
"term" : { "user" : "kimchy" }
}
}
可以通过 explain 参数来查看具体的计算方法,但是要注意:
- ES 的算分是按照 shard 进行的,即 shard 的分数计算是相互独立的,所以在使用 explain 的时候注意分片数。
- 可以通过设置索引的分片数来避免这个问题
2.4 count 数量
count API 允许轻松执行查询并获取该查询的匹配数。 它可以跨一个或多个索引并跨越一个或多个类型执行。
GET /twitter/_doc/_count
{
"query" : {
"term" : { "user" : "kimchy" }
}
}