相关文章推荐
傲视众生的鞭炮  ·  Array 函数 (Visual ...·  6 月前    · 
爽快的石榴  ·  QObject Class ...·  1 年前    · 
伤情的创口贴  ·  CASE (Transact-SQL) - ...·  2 年前    · 

默认情况下,结果集会按照相关性进行排序 – 相关性 越高,排名越靠前。为了使结果可以按照相关性进行排序,我们需要一个相关性的值。在ElasticSearch的查询结果中, 相关性分值会用 _score 字段来给出一个浮点型的数值,所以 默认情况 下,结果集以 _score 进行倒序排列.

二、Es中排序使用

2.1 简单排序

例如下面的按照创建时间的倒序排序。

GET example/docs/_search
  "query": {
    "match_all": {}
  "sort": [
      "createTime": {
        "order": "desc"
#按照创建时间降序 -> 简化成
GET example/docs/_search
  "query": {
    "match_all": {}
  "sort": [
      "createTime": "desc"
#按照创建时间升序
GET example/docs/_search
  "query": {
    "match_all": {}
  "sort": [
      "createTime": "asc"
#按照创建时间升序 -> 简化成
GET example/docs/_search
  "query": {
    "match_all": {}
  "sort": [
    "createTime"

order选项可以具有以下值:

asc: 升序排列

desc: 降序排列

在_score上排序时,该顺序默认为desc;在其他任何内容上排序时,该顺序默认为asc.

2.2 排序模式选项

Elasticsearch支持按数组或多值字段排序。模式选项控制选择哪个数组值对它所属的文档进行排序。模式选项可以具有以下值:

min: 选择最低值

max: 选择最高值

sum: 使用所有值的总和作为排序值。仅适用于基于数字的数组字段

avg: 使用所有值的平均值作为排序值。仅适用于基于数字的数组字段

median: 使用所有值的中位数作为排序值。仅适用于基于数字的数组字段

PUT example/docs/1?refresh
    "product": "chocolate",
    "price": [20, 10, 7]
#查询示例
GET example/docs/_search
    "query": {
        "match_all": {}
    "sort": [
            "price": {
                "order": "asc",
                "mode": "avg"

2.3 嵌套对象中排序

Elasticsearch还支持按一个或多个嵌套对象内部的字段排序。“按嵌套字段排序”支持具有以下属性的嵌套排序选项:

定义要在哪个嵌套对象上排序。实际的排序字段必须是此嵌套对象内的直接字段。当按嵌套字段排序时,此字段是必填字段

  • filter

嵌套路径内的内部对象应与其匹配的过滤器,以便通过排序将其字段值考虑在内。常见的情况是在嵌套的过滤器或查询中重复查询/过滤器。默认情况下,没有nested_filter处于活动状态

  • nested

与顶级嵌套相同,但适用于当前嵌套对象内的另一个嵌套路径

注意:在Elasticsearch 6.1版本之前。不推荐使用nested_path和nested_filter选项,而推荐使用上面的选项

GET example/docs/_search
    "query": {
        "match_all": {}
    "sort": [
            "items.goodPrice": {
                "order": "asc",
                "mode": "max",
                "nested": {
                    "path": "items"

上面的例子中,items是一个嵌套类型的字段。需要指定嵌套路径;否则,Elasticsearch不知道需要捕获哪些嵌套级别的排序值。

下面是多级嵌套的例子。代码仅做参考:

POST example/docs/_search
   "query": {
      "nested": {
         "path": "parent",
         "query": {
            "bool": {
                "must": {"range": {"parent.age": {"gte": 21}}},
                "filter": {
                    "nested": {
                        "path": "parent.child",
                        "query": {"match": {"parent.child.name": "matt"}}
   "sort" : [
         "parent.child.age" : {
            "mode" :  "min",
            "order" : "asc",
            "nested": {
               "path": "parent",
               "filter": {
                  "range": {"parent.age": {"gte": 21}}
               "nested": {
                  "path": "parent.child",
                  "filter": {
                     "match": {"parent.child.name": "matt"}
 

嵌套排序支持按脚本排序和按地理位置距离排序。

此外还有地理距离排序、脚本字段排序这种比较高级的方式。感兴趣的同学可以自己研究下。

脚本排序的示例如下

POST example/docs/_search
    "query" : {
        "match_all" : {}
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc[orderAmount].value * params.factor",
                "params" : {
                    "factor" : 1.1
            "order" : "desc"

排序时,Elasticsearch会将相关的排序字段值加载到内存中。这意味着每个分片应该有足够的内存来容纳它们。对于字符串的类型,不应是分词或标记的的字段。对于数字类型,如果可能,建议将类型显式设置为较窄的类型(如short,integer和float)

在实际开发中,真正使用ElasticSearch来搜索时,通常还是使用score来打分,来实现相关性高的记录在前,相关性低的记录在后。而架构也远远不止按照权重划分来打分,有可能我们的搜索权重是动态的,这时知识图谱的知识就会映入我们的眼帘,感兴趣的同学可以深入的了解和学习下。

一、概述默认情况下,结果集会按照相关性进行排序 – 相关性越高,排名越靠前。为了使结果可以按照相关性进行排序,我们需要一个相关性的值。在ElasticSearch的查询结果中, 相关性分值会用_score字段来给出一个浮点型的数值,所以默认情况下,结果集以_score进行倒序排列.二、Es中排序使用2.1 简单排序例如下面的按照创建时间的倒序排序。GET example/docs/_search{ "query": { "match_all": {} }, "sort": [
本实例为博主原创,属于简单易上手并且能够拿来就用的SpringBoot ES 项目,全文使用的是ElasticsearchTemplate进行开发。 本实例涵盖ES的各类操作,如索引操作、CRUD操作、批处理、结果排序、分页查询、检索查询、关键字查询、高亮显示、逻辑查询、过滤查询、分组查询等等。并且已经过生产环境验证,各位可放心使用。如有不对之处欢迎在博客留言交流。谢谢! 欢迎各位大神添加微信公众号:“愿为最亮星”,我们将在这一起探讨Java技术。
每个文档都有相关性评分,用一个正浮点数字段_score来表示 。_score的评分越高,相关性越高。 查询语句会为每个文档生成一个_score字段。(评分的计算方式取决于查询类型 不同的查询语句用于不同的目的,这里不详细介绍。) Elasticsearch 的相似度算法被定义为检索词频率/反向文档频率,TF/IDF,包括以下内容: 检索词频率 检索... 石墨烯2.x 不支持石墨烯1.x。 Python 3.6、3.7、3.8、3.9和3.10。 不支持Python 2。 Elasticsearch 6.x,7.x。 不需要对Elasticsearch 5.x的支持。 主要功能和亮点 已实现的ElasticsearchConnectionField和ElasticsearchObjectType是使用graphene的核心类。 用于搜索,过滤,排序等的可插入后端。不喜欢现有的后端吗? 覆盖,扩展或编写自己的。 搜索后端。 过滤后端。 订购后端。 突出显示后端。 源过滤器后端。 多面搜索后端(包括全局聚合)。 发布过滤器后端。 分数过滤器后端。 查询字符串后端。 简单查询字符串后端。 有关计划实施的内容,请参阅。 您是否需要Django REST Framework的
在这篇资源,我们将详细介绍如何使用DSL来构建复杂的查询语句,以满足各种搜索需求。首先,我们将学习DSL的基本结构和语法规则,包括查询、过滤器、聚合和排序等核心概念。通过深入了解DSL的语法,您将能够灵活地组合不同类型的查询条件,以实现精准的数据检索。接下来,我们将探讨DSL的高级特性和用法。我们将讨论全文搜索、模糊查询、正则表达式查询和范围查询等常用查询方式,以及它们在DSL的具体实现。同时,我们还将介绍布尔查询、should查询和must_not查询等与逻辑关系相关的查询语句,帮助您更好地理解DSL的灵活性和强大之处。此外,我们还将深入讨论聚合操作在DSL的应用。通过使用聚合查询,您可以对检索结果进行分组、统计和计算等操作,以获取更全面的数据分析结果。我们将详细介绍诸如terms聚合、date_histogram聚合和range聚合等不同类型的聚合操作,帮助您掌握DSL在数据分析方面的强大功能。最后,我们将分享一些实用技巧和最佳实践,帮助您充分发挥DSL在Elasticsearch的优势。我们将探讨性能优化、查询调试和索引优化等关键主题,以提升查询效率和搜索准确性。
"birthday":"1996-6-6", "interest":"swimming climbing walking", "address":"ShanDong province", "company":"yunzhihui", "h... 在开发项目一般都会有搜索功能。如果是面向C端的搜索功能,往往都特别考验性能。比如普通的商城系统的商品搜索或者一些资源的站内搜索。 可能以前的做法就是对商品表做一个按名称或商品描述做模糊查询。更好一点的是对搜索关键字进行分词,并且专门建一个搜索词库表。不过前期需要对搜索词进行拆解然后幂集组合并于商品ID关联,搜索字与词库表的字以完全匹配的方式查询并找到商品ID。 虽然建词库表也是不错的解决方法,但是还要拆解存库建索引,相对比较麻烦。所以也是在网上查询了解到了elast... 在这个示例,我们使用了 ".keyword" 后缀来指定精确匹配的文本类型字段。如果您没有使用 ".keyword" 后缀,则Elasticsearch将默认使用分析后的文本进行排序。 请注意,如果您想要同时使用多个排序字段,可以使用数组来指定它们的顺序: "sort": [ {"numeric_field": {"order": "asc"}}, {"date_field": {"order": "desc"}}, {"text_field.keyword": {"order": "asc"}}