控制查询返回结果

ElasticSearch支持对查询返回的结果做各种操作:

  1. 返回yaml格式的结果
  2. 返回特定的字段(Source filtering)
  3. 控制返回结果的条数
  4. 使用offset对返回结果进行遍历
  5. 对返回结果进行自定义排序

返回yaml格式的结果

默认查询返回的是json格式,在查询后面加上?format=yaml,返回的结果变成yaml格式:

image-20220821101547408

Source filtering

ElasticSearch默认返回所有mapping里的字段,我们可以根据需要返回特定的字段,减少返回结果的大小。

例如,如果只想知道有多少条匹配结果,不想查看具体的信息,则设置_source=true:

image-20220821102342245

如果只对titlecreated字段感兴趣,其他字段不返回。则查询条件为:

GET /recipe/_search
{
  "_source": ["title","created"], 
  "query": {
    "match": {
      "title": "pasta"
    }
  }
}

image-20220821102440951

控制返回结果的条数

默认ElasticSearch搜索完成后返回10条结果,使用size参数能控制返回结果的条数。

使用size参数时,有两种方式,一种是放在GET URL里:

image-20220821102928789

另一种是放到参数body里:

image-20220821102955173

两种方式都能达到预期结果。

指定offset

在使用关系型数据库查询时,如果返回的结果很多,我们需要使用limit + offset查询,例如:

select * from student where sex='male' limit 10,5

在ElasticSearch中原理也一样,默认查询offset为0,返回分数最高的前几条结果:

image-20220821103441453

在ElasticSearch中,使用from参数指定offset。第一页返回了两条结果,想继续查询下一页,将from设置成2:

image-20220821103507925

将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):

image-20220821123136944


在关系型数据库中,支持按多个字段排序,例如当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时,按创建日期倒序排列:

image-20220821123630128


数组类型的排序

ratings字段是数组类型,表示顾客对这个菜谱的评分:

image-20220821123935932

如果想对ratings字段进行排序,Elasticsearch支持四种模式:avg, min, max, sum

例如计算ratings的平均值再倒序排列:

image-20220821124225469

上图返回结果中sort值为4.25, 它是四个rating的平均值。