资讯专栏INFORMATION COLUMN

ElasticSearch 学习笔记 - 9.排序

CloudDeveloper / 3701人阅读

摘要:多级排序排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个值完全相同时才会按照第二个条件进行排序,以此类推。

在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回
默认排序是 _score 降序

有时,相关性评分对你来说并没有意义。例如,下面的查询返回所有 user_id 字段包含 1 的结果:

GET /_search
{
    "query" : {
        "bool" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}

如果不需要为0分

GET /_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "term" : {
                    "user_id" : 1
                }
            }
        }
    }
}
按照字段值排序

通过时间来对 tweets 进行排序是有意义的,最新的 tweets 排在最前。 我们可以使用 sort 参数进行实现:

GET /_search
{
    "query" : {
        "bool" : {
            "filter" : { "term" : { "user_id" : 1 }}
        }
    },
    "sort": { "date": { "order": "desc" }}
}

可以简写为

  "sort": "number_of_children"

字段将会默认升序排序 ,而按照 _score 的值进行降序排序。

多级排序

排序条件的顺序是很重要的。结果首先按第一个条件排序,仅当结果集的第一个 sort 值完全相同时才会按照第二个条件进行排序,以此类推。

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 字段用于排序

GET /_search
{
    "query": {
        "match": {
            "tweet": "elasticsearch"
        }
    },
    "sort": "tweet.raw"
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/34289.html

相关文章

  • ElasticSearch 学习笔记 - 7. 字段类型

    摘要:字符串类型类型在旧版本中使用较多,从开始不再支持,由和类型替代。当一个字段是要被全文搜索的,比如内容产品描述,应该使用类型。如果字段需要进行过滤比如查找已发布博客中属性为的文章排序聚合。默认情况下,该类型的字段只存储不索引。 1、字符串类型 (1)string string类型在ElasticSearch 旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,...

    reclay 评论0 收藏0
  • elasticsearch学习笔记(三十一)——Elasticsearch doc value正排索

    摘要:通过倒排索引锁定文档之后,看到每个的每个,然后进行排序,所谓的正排索引就是。对于而言,在建立索引的时候,一方面会建立倒排索引,以供搜索使用一方面会建立正排索引,也就是以供排序,聚合,过滤等使用。 在我们搜索的时候,要依靠倒排索引,但是当我们排序的时候,需要依靠正排索引。通过倒排索引锁定文档document之后,看到每个document的每个field,然后进行排序,所谓的正排索引就是d...

    antz 评论0 收藏0
  • elasticsearch学习笔记(三十二)——Elasticsearch 解密query、fetc

    摘要:注意这里千万不要理解成每个都是返回条数据。这样理解是错误的下面做一下详细的分析请求首先可能是打到一个不包含这个的的上去,这个就是一个协调节点,那么这个就会将搜索请求转发到的三个所在的上去。 query pharse 基本原理:(1)搜索请求发送到某一个coordinate node协调节点,会构建一个priority queue,长度以paging操作from和size为准,默认是10...

    hlcc 评论0 收藏0
  • elasticsearch学习笔记(二十三)——Elasticsearch 分页搜索以及深分页性能问

    摘要:在实际应用中,分页是必不可少的,例如,前端页面展示数据给用户往往都是分页进行展示的。分页搜索分页搜索采用的是。表示查询结果的起始下标,表示从起始下标开始返回文档的个数。注意这里千万不要理解成每个都是返回条数据。 在实际应用中,分页是必不可少的,例如,前端页面展示数据给用户往往都是分页进行展示的。 1、ES分页搜索 Elasticsearch分页搜索采用的是from+size。from表...

    cc17 评论0 收藏0
  • elasticsearch学习笔记(三十三)——Elasticsearch Bouncing Res

    摘要:它接受像和这样的值这些值在文档页面被详细解释。但是最有用的值是某些随机字符串,它可以避免问题。 想象一下有两个文档有同样值的时间戳字段,搜索结果用 timestamp 字段来排序。 由于搜索请求是在所有有效的分片副本间轮询的,那就有可能发生主分片处理请求时,这两个文档是一种顺序, 而副本分片处理请求时又是另一种顺序。 这就是所谓的 bouncing results 问题: 每次用户刷新...

    wenshi11019 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<