ElasticSearch中的sort排序和filedData作用

  • 默认情况下,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

posted on 2020-05-31 20:06  luzhouxiaoshuai  阅读(2306)  评论(0编辑  收藏  举报

导航