Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch中,Painless脚本通常用于计算评分、排序、聚合或者其他计算任务

Elasticsearch中,Painless脚本通常用于计算评分、排序、聚合或者其他计算任务

作者头像
小冷coding
发布于 2024-05-14 04:31:08
发布于 2024-05-14 04:31:08
75300
代码可运行
举报
文章被收录于专栏:小冷coding小冷coding
运行总次数:0
代码可运行
最近在开发过程中遇到这样的一个小需求,给商品进行分组,每一组有不同的数量的商品,每个组要进行排序,每一组的商品也要进行排序。

商品的数据存储在ES中,需要通过spuIds进行排序查询数据返回。这时就需要用到ES中的排序部分,它需要使用一个Painless脚本,根据传递的参数值对id进行排序。

最终正确返回的数据结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 {
            "id": "3",
            "name": "第1组",
            "spuIds":  [19, 7, 20, 10, 2, 6, 3, 18, 9, 8, 1],
            "backgroundColor": "#1677FF",
            "productPages": {
                "data":[
                     {
                      "id": "19",
                      "spuId": "1106",
                      "skuId": "1106",
                      "name": "人工牛黄甲硝唑胶囊",
                      "price": 39.9,
                      "underlinedPrice": 78.0,
                      "shopId": "27"
                     },.....],
                  "totalCount": 15,
                  "pageSize": 10,
                  "totalPages": 2,
                  "nextPage": false,
                  "current": 2
             },
            "nextPage": true,
            "sort": 7
        }

在Elasticsearch中,Painless是一种安全、沙盒化的脚本语言,专门用于执行复杂的计算和操作。Painless的设计目标是提供一个功能强大但又足够安全的脚本环境,以便在Elasticsearch查询和聚合中执行自定义逻辑。

以下是Painless脚本在Elasticsearch中的一些常见用途:

计算评分:在搜索查询中,你可以使用Painless脚本来定义自定义的评分函数,从而影响文档的排序和排名。例如,你可以根据文档的某个字段值或其他计算来调整文档的得分。

排序:除了默认的基于字段值的排序外,你还可以使用Painless脚本来定义更复杂的排序逻辑。这意味着你可以根据文档内容的计算结果或其他动态条件对搜索结果进行排序。

聚合:在聚合查询中,Painless脚本可以用来定义聚合的桶键(bucket keys)或度量(metrics)。这允许你根据文档内容的计算结果来分组或计算聚合结果。

脚本字段:你可以使用Painless脚本来动态地添加或修改搜索结果的字段。这对于在搜索结果中包含计算后的值或格式化后的数据非常有用。

更新文档:虽然不推荐频繁使用脚本来更新文档,但在某些情况下,你可以使用Painless脚本来执行简单的文档更新操作。

需要注意的是,虽然Painless脚本提供了很大的灵活性,但过度使用或不当使用可能会对Elasticsearch集群的性能和稳定性产生负面影响。因此,在设计查询和聚合时,应谨慎使用脚本,并尽可能优化其性能。

因此这次Elasticsearch的DSL查询用到的脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /spu/_search
{
  "from": 0,
  "size": 5,
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "id": [19, 7, 20, 10, 2, 6, 3, 18, 9, 8, 1]
          }
        },
        {
          "term": {
            "status": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "_script": {
        "script": {
          "source": "return params.doc['id'].value",
          "lang": "painless",
          "params": {
            "1": 10,
            "2": 4,
            "3": 6,
            "6": 5,
            "7": 1,
            "8": 9,
            "9": 8,
            "10": 3,
            "18": 7,
            "19": 0,
            "20": 2
          }
        },
        "type": "number",
        "order": "asc"
      }
    }
  ]
}

你会发现params是一个Map结构,通过id进行查询排序的。

params中key就是spuId里面的参数,value就是排序的数值。

Java中如何实现呢?代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        //query.getSpuIds()查询条件
        int size = query.getSpuIds().size();
        Map<String, Object> scriptParams = new HashMap<>(size);
        for (int i = 0; i < size; i++) {
            scriptParams.put(String.valueOf(query.getSpuIds().get(i)), i);
        }
        // 构建排序脚本
        ScriptSortBuilder scriptSortBuilder = new ScriptSortBuilder(new Script(ScriptType.INLINE, "painless",
                "return params[doc['id'].value+'']",
                scriptParams), ScriptSortBuilder.ScriptSortType.NUMBER);
        // 执行查询
        queryBuilder.withPageable(PageRequest.of(query.getCurrent() - 1, query.getPageSize()));
        queryBuilder.withSort(scriptSortBuilder);

写到这里问题就解决了,前台页面就能很好地展示分页结构了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小冷coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Anaconda使用详解:从安装到高效管理Python环境
Anaconda是一款开源的Python和R语言的发行版本,其主要目的是为数据科学、机器学习、大数据处理和科学计算提供一个集成的开发环境。Anaconda集成了大量常用的数据科学库和工具,并附带了强大的环境管理和包管理功能,使得Python环境的配置和维护变得简单高效。本文将详细介绍Anaconda的安装、使用以及如何利用它来高效管理Python环境和包。
CoderJia
2024/10/18
9330
Anaconda使用详解:从安装到高效管理Python环境
使用 Miniconda + Mamba 构建高效的 AI 开发环境
在人工智能(AI)开发中,环境管理和依赖安装是一个关键问题。Anaconda 是一个广受欢迎的 Python 发行版,提供了丰富的 AI 相关库,但它体积庞大,安装和更新速度较慢。Miniconda + Mamba 组合提供了一个轻量、高效的替代方案。
IT蜗壳-Tango
2025/03/17
2490
conda创建虚拟环境怎么删除(anaconda离线创建虚拟环境)
在Anaconda中conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。所以对虚拟环境进行创建、删除等操作需要使用conda命令。
全栈程序员站长
2022/07/31
4.6K0
Anaconda入门详解
Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学、机器学习、大数据处理和预测分析),Anaconda致力于简化包管理和部署。Anaconda的包使用软件包管理系统Conda进行管理。超过1200万人使用Anaconda发行版本,并且Anaconda拥有超过1400个适用于Windows、Linux和MacOS的数据科学软件包。
py3study
2020/01/03
1.7K0
万字长文:深度全面了解Conda的各种骚操作,强烈建议收藏
本文重点分享Python的包管理工具和环境管理工具:conda。 未来的日子中,期待和大家一起成长,一起分享高质量原创文章
小码匠
2022/06/16
3.3K0
万字长文:深度全面了解Conda的各种骚操作,强烈建议收藏
windows10安装配置并使用Miniconda3
Conda 是包管理和环境管理工具,Anaconda 在 Conda 的 基础上预装了大量科学计算包
九转成圣
2025/04/08
4280
windows10安装配置并使用Miniconda3
可重复的生信分析系列二:Conda的介绍
可重复的生信分析一直是未来的趋势。如果实现可重复的生信分析,关键在于分析软件版本的控制,一致的环境设置还有良好的分析流程的记录。Conda可以说是版本控制和生信工具安装的一大神器。相信大家对它了解肯定不少,但是又该怎么样利用它,进行可重复的分析呢?今天继续讲第二部分 Conda的介绍。
生信菜鸟团
2020/03/30
1.7K0
Anaconda虚环境管理
当接触的东西越多越需要进行分类管理,同样的python环境也需要进行分类管理。anaconda不仅在数据科学有较高的建树,在python环境管理上也同样出色。
HsuHeinrich
2025/02/06
1170
Anaconda虚环境管理
Jupyter Notebook中配置多版本Python
最新 Anaconda 中,默认安装 Python 3.8.3,因为某些原因需要使用 Python 3.7
yiyun
2022/04/01
5K0
Jupyter Notebook中配置多版本Python
Miniconda安装和使用
Miniconda是什么? 要解释Miniconda是什么,先要弄清楚什么是Anaconda,它们之间的关系是什么? 而要知道Anaconda是什么,最先要明白的是搞清楚什么是Conda,参考:Conda简单教程。 一言以蔽之,Conda是Python中用于管理依赖包和虚拟环境的工具,Anaconda是一个带有Conda工具的软件包(附带了Conda、python和150多个科学软件包及其相关的包),而Miniconda是一个Anaconda的轻量级替代,默认只包含了Python和Conda。 也就是说,安装了Miniconda,就可以直接使用Python和Conda了。
编程随笔
2022/09/27
2.5K0
(数据科学学习手札81)conda+jupyter玩转数据科学环境搭建
  我们在使用Python进行数据分析时,很多时候都在解决环境搭建的问题,不同版本、依赖包等问题经常给数据科学工作流的搭建和运转带来各种各样令人头疼的问题,本文就将基于笔者自己摸索出的经验,以geopandas环境的搭建为例,教你使用conda+jupyter轻松搞定环境的搭建、管理与拓展。
Feffery
2020/04/01
1K0
conda常用命令整理
Conda是Anaconda中一个强大的包和环境管理工具,可以在Windows系统中的的Anaconda Prompt命令行使用,也可以在macOS或者Linux系统的终端窗口的命令行使用。
编程思维
2023/01/26
3.7K0
Anaconda使用总结
1、Anaconda简介2、Anaconda安装(Linux和Windows)3、Conda的包管理与环境管理
用户7886150
2021/01/26
9170
一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移
Conda是一种通用包管理系统,旨在构建和管理任何语言的任何类型的软件。通常与Anaconda (集成了更多软件包,https://www.anaconda.com/products/individual)和Miniconda (只包含基本功能软件包, https://conda.io/miniconda.html)一起分发。
生信宝典
2021/12/01
3.1K0
一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移
JupyterLab 实战
Project Jupyter[1] (/ˈdʒuːpɪtər/) 是一个旨在开发跨多种编程语言的交互式计算的开源软件、开放标准和服务的项目。
AlphaHinex
2024/04/09
5010
JupyterLab 实战
python的环境,你再也不用愁
conda是一个包,依赖和环境管理工具,适用于多种语言,如: Python, R, Scala, Java, Javascript, C/ C++, FORTRAN。
用户10002156
2022/12/21
6160
【Anaconda实用教程】Anaconda使用修改.condarc文件和常用命令、及解决没有.condarc的情况
.condarc保存了anaconda的配置信息,该文件存储在C:\Users\xxxx.conda\ 路径中,在如下代码中:
程序员洲洲
2024/06/07
4.2K0
【Anaconda实用教程】Anaconda使用修改.condarc文件和常用命令、及解决没有.condarc的情况
阅读量过万的conda使用总结,跨越一年的更新
conda分为anaconda和miniconda。anaconda是包含一些常用包的版本(这里的常用不代表你常用 微笑.jpg),miniconda则是精简版,需要啥装啥,所以推荐使用miniconda。
生信技能树
2019/10/09
2K0
阅读量过万的conda使用总结,跨越一年的更新
conda虚拟环境
原文链接:https://blog.csdn.net/weixin_43593330/article/details/93378987
TeeyoHuang
2019/11/14
1.4K0
4步为Jupyter Notebook添加Conda环境
打开你的Jupyter Notebook,查看界面是否已经可以选择firstEnv作为新的环境。
王诗翔呀
2022/03/30
1.5K0
4步为Jupyter Notebook添加Conda环境
推荐阅读
相关推荐
Anaconda使用详解:从安装到高效管理Python环境
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验