elasticsearch权威指南 学习23

elasticsearch权威指南-- getting start 第八章 Sorting and Relevance(1)

Sorting

为了通过相关性来进行排序,elasticsearch用返回结果中的_score来描述相关性。

有些时候我们可能不一定会得到一个有意义的score,比如像下面这个查询一样:

curl -XPOST ‘localhost:9200/stats/_search’ -d’
{
     “query”: {
          “filtered”: {
               “filter”: {
                    “term”: {
                    “event_id”: 22001
                    }
               }
          }
     }
}
 响应:
“hits”: {
     “total”: 489986,
          “max_score”: 1,
          “hits”: [
          {
               “_index”: “stats”,
               “_type”: “stats”,
               “_id”: “AU3nECoQPC8NC7-TZAad”,
               “_score”: 1,
               “_source”: {
                    ….
                    }
               }

我们会看到所有的_score的值全部为1,这是因为在filtered中会默认加入match_all查询,使得所有的document的相关性相同。

Sorting by Field Values

在这个例子中,我们希望查询时间最近的tweet,即时间离现在越近相关性越大。我们使用sort参数来完成:

curl -XPOST localhost:9200/stats/_search   -d’
{
     “query”: {
          “filtered”: {
               “filter”: {
                    “term”: {
                         “event_id”: 22001
                    }
               }
          }
     },
     “sort”: {
          “uts”: {
               “order”: “desc”
          }
     }
}
响应:
“hits”: {
     “total”: 489986,
     “max_score”: null,
     “hits”: [
     {
          “_index”: “stats”,
          “_type”: “stats”,
          “_id”: “AU3nFQlXPC8NC7-TqEhf”,
          “_score”: null,
          “_source”: {
                …
               “uts”: 1431608446000,
      },
     “sort”: [
          1431608446000
          ]
     }
{
          “_index”: “stats”,
          “_type”: “stats”,
          “_id”: “AU3nFQlXPC8NC7-TqEfq”,
          “_score”: null,
          “_source”: {
               …
               “uts”: 1431608441000,
     },
     “sort”: [
          1431608441000
          ]
     }
     …

在响应中我们看到一个新的参数sort,它包含了一个用于排序的字段值,在这个例子中我们用的是uts作为排序的值,另外我们注意到_score和max_score都为null。另外我们要知道,计算这个_score值是非常费资源的一个操作,所以在只要求对相关性进行排序的时候才会计算这个值。而如果你想在查询的时候必须计算_score,那么就需要把track_scores参数设为true。像下面这样:

curl -XPOST localhost:9200/stats/_search?track_scores=true   -d’…’
这个时候你会看到_socre和max_score字段的值为1。但是这个确实要慎用,因为可能会比较费资源。
另外,作为一个捷径,你可以指定字段的名字排序,默认情况下是降序排序,像这样:
curl -XPOST localhost:9200/stats/_search   -d’
{
     “query”: {
          “filtered”: {
               “filter”: {
                    “term”: {
                         “event_id”: 22001
                    }
               }
          }
     },
     “sort”:”uts”
}
Multilevel Sorting
有时我们想将_score和date进行组合排序,先按时间排序,再按查询相关性排序。
curl -XPOST localhost:9200/stats/_search   -d’
{
     “query”: {
          “filtered”: {
               “query”: {
                    “match”: {
                         “channel”: “QQ”
                    }
               },
               “filter”: {
                    “term”: {
                         “event_id”: 22001
                    }
               }
           }
       },
     “sort”: [
     {
          "uts": {
               "order": "desc"
               }
          },
     {
          "_score": {
               "order": "desc"
               }
          }
     ]
}
响应:
“hits”: {
     “total”: 75966,
     “max_score”: null,
     “hits”: [
     {
          “_index”: “stats”,
          “_type”: “stats”,
          “_id”: “AU3nFQlXPC8NC7-TqEdg”,
          “_score”: 2.8421838,
          “_source”: {
               …
               “uts”: 1431608432000,
               “channel”: “QQ”
          },
          “sort”: [
               1431608432000
               ,
               2.8421838
               ]
          }
     ,
     {
          “_index”: “stats”,
          “_type”: “stats”,
          “_id”: “AU3nFQlXPC8NC7-TqEb6″,
          “_score”: 2.8445587,
          “_source”: {
               …
               “uts”: 1431608428000,
               “channel”: “QQ”
          },
          “sort”: [
               1431608428000
               ,
               2.8445587
          ]
     }
我们也可以使用Query-string进行相似的排序,这里使用的是sort排序。
GET /_search?sort=date:desc&sort=_score&q=search

Sort on Multivalue Fields

当我们指定排序的字段不止一个的时候(比如uts的值有多个),我们无法掌握排序字段的顺序,这个时候我们可以用到mode参数,它可以接受min,max,avg,或者sum参数,比如下面这个例子,它先求出各个document中dates中最小的那个值,然后根据各个document的date最小值进行排序:

“sort”: {
     “dates”: {
          “order”: “asc”,
          “mode”: “min”
     }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>