问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Elasticsearch多字段排序实战技巧

创作时间:
作者:
@小白创作中心

Elasticsearch多字段排序实战技巧

引用
CSDN
12
来源
1.
https://blog.csdn.net/UbuntuTouch/article/details/138066503
2.
https://blog.csdn.net/wang0907/article/details/136699246
3.
https://blog.csdn.net/laoyang360/article/details/140483950
4.
https://blog.csdn.net/wkywky123/article/details/137943472
5.
https://blog.csdn.net/weixin_41866717/article/details/139879070
6.
https://www.restack.io/p/java-problem-solving-methodologies-answer-elastic-java-api-sort
7.
https://www.cnblogs.com/szrs/p/18269216
8.
https://www.elastic.co/search-labs/blog/scoring-documents-by-the-closest-one-with-multiple-kNN-fields
9.
https://www.restack.io/p/java-problem-solving-methodologies-answer-elasticsearch-java-sort
10.
https://www.pipiho.com/es/7.7/cn/multi-search-template.html
11.
https://www.cnblogs.com/abiu/p/16050505.html
12.
https://www.cnblogs.com/TheMagicalRainbowSea/p/18424015

在大数据处理领域,Elasticsearch的多字段排序功能备受关注。通过高级排序技术,如多级排序和脚本排序,可以实现复杂的业务需求。例如,在商品搜索中,可以通过Groovy Script脚本将多个字段值归为一个评分进行排序,以满足特定的业务规则。此外,使用FunctionScoreQueryBuilder还可以根据文档类型动态调整权重,使原创内容优先显示。这些技巧不仅提升了查询结果的相关性,还增强了用户体验。

01

基础篇:Elasticsearch多字段排序入门

在Elasticsearch中,多字段排序是通过在查询的sort部分指定每个字段及其排序方式来实现的。基本语法如下:

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "field1": {
        "order": "desc"
      }
    },
    {
      "field2": {
        "order": "asc"
      }
    }
  ]
}

在这个例子中,我们对field1按降序排序,对field2按升序排序。需要注意的是,Elasticsearch允许排序的只能是属性字段,不能是索引或摘要字段。

02

实战篇:应用场景中的多字段排序

电商商品搜索

在电商场景中,商品搜索通常需要考虑多个维度的排序,如价格、销量、用户评分等。以下是一个示例:

GET /products/_search
{
  "query": {
    "match": {
      "title": "智能手表"
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    },
    {
      "sales": {
        "order": "desc"
      }
    },
    {
      "rating": {
        "order": "desc"
      }
    }
  ]
}

这个查询将首先按价格升序排序,然后在价格相同的情况下按销量降序排序,最后按用户评分降序排序。

日志分析

在日志分析场景中,通常需要按时间、严重程度、来源等多个维度进行排序。例如:

GET /logs/_search
{
  "query": {
    "match": {
      "message": "error"
    }
  },
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    },
    {
      "severity": {
        "order": "desc"
      }
    },
    {
      "source": {
        "order": "asc"
      }
    }
  ]
}

这个查询将首先按时间降序排序,然后在时间相同的情况下按严重程度降序排序,最后按来源升序排序。

03

进阶篇:高级排序技术

Groovy Script脚本排序

在某些复杂场景下,可能需要将多个字段的值综合计算后进行排序。这时可以使用Groovy Script脚本排序。例如,我们可以将商品的价格、销量和评分综合计算出一个综合评分:

GET /products/_search
{
  "query": {
    "match": {
      "title": "智能手表"
    }
  },
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "groovy",
        "source": "doc['price'].value * 0.3 + doc['sales'].value * 0.5 + doc['rating'].value * 0.2"
      },
      "order": "desc"
    }
  }
}

这个查询将根据价格、销量和评分的加权平均值进行排序。

FunctionScoreQueryBuilder

FunctionScoreQueryBuilder允许根据文档的特定属性动态调整权重。例如,我们可以让原创内容在搜索结果中优先显示:

GET /articles/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "title": "Elasticsearch"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "is_original": true
            }
          },
          "weight": 2
        }
      ],
      "score_mode": "multiply"
    }
  }
}

这个查询将使原创内容的权重翻倍,从而在搜索结果中优先显示。

04

性能优化

多字段排序虽然强大,但也会对性能产生影响。以下是一些优化建议:

  1. 避免在高基数字段上排序:高基数字段(如用户ID)上的排序会显著降低性能。
  2. 使用索引排序:在创建索引时预先指定排序字段,可以提高排序性能。
  3. 限制结果数量:使用size参数限制返回的结果数量,避免一次性处理大量数据。
  4. 禁用优化:在某些情况下,Elasticsearch会启用优化以加快排序速度,但这可能导致不准确的总命中数。如果需要精确的总命中数,可以禁用这种优化:
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "field1": {
        "order": "desc"
      }
    }
  ],
  "track_total_hits": true,
  "track_scores": true,
  "disable_optimizations": {
    "sorting": {
      "degrading": false
    }
  }
}

通过以上技巧,可以有效地提升Elasticsearch多字段排序的性能和实用性。在实际应用中,需要根据具体业务场景和数据特点,灵活选择和组合这些排序技术,以达到最佳的搜索效果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号