ElasticSearch支持对查询返回的结果做各种操作:
Source filtering
)默认查询返回的是json格式,在查询后面加上?format=yaml
,返回的结果变成yaml格式:
ElasticSearch默认返回所有mapping里的字段,我们可以根据需要返回特定的字段,减少返回结果的大小。
例如,如果只想知道有多少条匹配结果,不想查看具体的信息,则设置_source=true
:
如果只对title
和created
字段感兴趣,其他字段不返回。则查询条件为:
GET /recipe/_search
{
"_source": ["title","created"],
"query": {
"match": {
"title": "pasta"
}
}
}
默认ElasticSearch搜索完成后返回10条结果,使用size参数能控制返回结果的条数。
使用size参数时,有两种方式,一种是放在GET URL里:
另一种是放到参数body里:
两种方式都能达到预期结果。
在使用关系型数据库查询时,如果返回的结果很多,我们需要使用limit + offset
查询,例如:
select * from student where sex='male' limit 10,5
在ElasticSearch中原理也一样,默认查询offset为0,返回分数最高的前几条结果:
在ElasticSearch中,使用from
参数指定offset。第一页返回了两条结果,想继续查询下一页,将from设置成2:
将from设置成4、6、8…,能继续查询后面的结果。
默认返回结果按relavance score
从大到小排列。ElasticSearch支持自定义字段来排序,类似于关系型数据库中的order by
:
select * from student order by age desc
按created_by
倒序返回结果:
GET /recipe/_search
{
"_source": ["created"],
"sort": [
{
"created": {
"order": "desc"
}
}
],
"query": {
"match": {
"title": "pasta"
}
}
}
返回结果按created_by
倒序排序,且多了一个sort字段,表示该字段的值(日期被转换成了unix time):
在关系型数据库中,支持按多个字段排序,例如当age相同时,按name再排序:
select * from student ORDER BY age DESC, name ASC
Elasticsearch中也支持这种功能。例如按preparation_time_minutes
升序排列,当preparation_time_minutes
相同时,按created
倒序排列:
GET /recipe/_search
{
"_source": ["created","preparation_time_minutes"],
"sort": [
{
"preparation_time_minutes": {
"order": "asc"
},
"created": {
"order": "desc"
}
}
],
"query": {
"match": {
"title": "pasta"
}
}
}
从返回结果中看到,当prepration_time_minutes
都为15时,按创建日期倒序排列:
ratings字段是数组类型,表示顾客对这个菜谱的评分:
如果想对ratings字段进行排序,Elasticsearch支持四种模式:avg, min, max, sum
例如计算ratings的平均值再倒序排列:
上图返回结果中sort值为4.25, 它是四个rating的平均值。