- 默认情况下,ElasticSearch 会根据算分进行排序;
- 可以使用 sort API 指定排序的规则;
POST /kibana_sample_data_ecommerce/_search { "size": 5, "query": { "match_all": { } }, "sort": [ {"order_date": {"order": "desc"}} ] }
在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回
默认排序是 _score 降序
有时,相关性评分对你来说并没有意义。例如,下面的查询返回所有 user_id 字段包含 1 的结果:
多级排序
排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个 sort 值完全相同时才会按照第二个条件进行排序,以此类推。
GET /_search
GET /_search { "query" : { "bool" : { "must": { "match": { "tweet": "manage text search" }}, "filter" : { "term" : { "user_id" : 2 }} } }, "sort": [ { "date": { "order": "desc" }}, { "_score": { "order": "desc" }} ] }
字符串排序与多字段
被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。
如果你想分析一个字符串,如 fine old art , 这包含 3 项。
我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,
但是 Elasticsearch 在排序过程中没有这样的信息。。一个字符串如果进行分词之后,如果你对字符串进行排序的话,他的排序规则就不想日期、数字那样是固定的,如果想按照一个字符串作为一个整体进行排序,不进行分词之后的排序,可以做下面的操作
一个简单的方法是用两种方式对同一个字符串进行索引,这将在文档中包括两个字段:
analyzed 用于搜索,
not_analyzed 用于排序
"tweet": { "type": "string", "analyzer": "english" }
将上面的转为下面的格式
"tweet": { "type": "string", "analyzer": "english", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } }
其中字段tweet字段进行查询操作会进行分词,tweet.raw字段不进行分词,作为sort操作,整个字符串不进行分词整个字符串进行排序,但是将文本字段用于聚合,排序需要开启fielddata字段
https://segmentfault.com/a/1190000016645964
tweet