ElasticSearch DSL Script使用案例分享

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: the best elasticsearch highlevel java rest api-----bboss       ElasticSearch DSL Script使用案例分享,涉及到的功能点: 脚本片段使用 多行文本使用 添加属性字段 1前言 先看看elastics...
the best elasticsearch highlevel java rest api-----bboss      

ElasticSearch DSL Script使用案例分享,涉及到的功能点:

  • 脚本片段使用
  • 多行文本使用
  • 添加属性字段

1前言
先看看elasticsearch官方的script dsl块文本的写法:通过一对"""   """来包含块文本
{
  "query": {
    "function_score": {
      "script_score": {
        "script": {
          "lang": "painless",
          "source": """
            int total = 0;
            for (int i = 0; i < doc['goals'].length; ++i) {
              total += doc['goals'][i];
            }
            return total;
          """
        }
      }
    }
  }
}

对应的bboss script dsl块文本的写法:通过一对@"""   """来包含块文本

{
  "query": {
    "function_score": {
      "script_score": {
        "script": {
          "lang": "painless",
          "source": @"""
            int total = 0;
            for (int i = 0; i < doc['goals'].length; ++i) {
              total += doc['goals'][i];
            }
            return total;
          """
        }
      }
    }
  }
}

bboss中管理的dsl块文本和elasticsearch官方的dsl中的块文本唯一的区别就是在开头的"""前面加了个@符号

2.定义dsl配置
在demo.xml文件中增加以下配置
    <property name="scriptPianduan">
        <![CDATA[
            "params": {
              "last": #[last],
              "nick": #[nick]
            }
        ]]>
    </property>
    <property name="scriptDsl">
        <![CDATA[{
          "script": {
            "lang": "painless",
            "source": @"""  ##块文本开始
              ctx._source.last = params.last;
              ctx._source.nick = params.nick
            """,##块文本结束
            @{scriptPianduan}
          }
        }]]>
    </property>

2.执行脚本处理
定义类ScriptImpl,增加方法updateDocumentByScriptPath来执行脚本
package org.bboss.elasticsearchtest.script;
/*
 *  Copyright 2008 biaoping.yin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

import org.bboss.elasticsearchtest.crud.DocumentCRUD;
import org.frameworkset.elasticsearch.ElasticSearchHelper;
import org.frameworkset.elasticsearch.client.ClientInterface;

import java.util.HashMap;
import java.util.Map;

public class ScriptImpl {
	private String mappath = "esmapper/demo.xml";

	public void updateDocumentByScriptPath(){
		//初始化数据,会创建type为demo的indice demo,并添加docid为2的文档
		DocumentCRUD documentCRUD = new DocumentCRUD();
		documentCRUD.testCreateIndice();
		documentCRUD.testBulkAddDocument();
		//创建加载配置文件的客户端工具,用来检索文档,单实例多线程安全
		ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil(mappath);
		Map<String,Object> params = new HashMap<String,Object>();
		//为id为2的文档增加last和nick两个属性
		params.put("last","gaudreau");
		params.put("nick","hockey");
        //通过script脚本为文档id为2的文档增加last和nick两个属性,为了演示效果强制refresh,实际环境慎用
		clientUtil.updateByPath("demo/demo/2/_update?refresh","scriptDsl",params);
        //获取更新后的文档,会看到新加的2个字段属性
		String doc = clientUtil.getDocument("demo","demo","2");
		System.out.println(doc);

	}
}


3.一个比较复杂Script的案例
<property name="updateStoreProductDynamicTemplate">
        <![CDATA[
        {
          "query": {
            "bool": {
              "must": [
                {
                  "term": {
                    "_id": #[id]
                  }
                }
              ]
            }
          },
          "script": {
            "lang": "painless",
            "source": @"""
                ctx._source.is_expired_dynamic_price=params.is_expired_dynamic_price;
                ctx._source.dynamic_price_template_id=params.dynamic_price_template_id;
                ctx._source.dynamic_price_template.id=params.dynamic_price_template_id;
                ctx._source.dynamic_price_template.code=params.dynamic_price_template_code;
                ctx._source.dynamic_price_template.name=params.dynamic_price_template.name;
                ctx._source.dynamic_price_template.count_products=params.dynamic_price_template.count_products;
                ctx._source.dynamic_price_template.is_deleted=params.dynamic_price_template.is_deleted;
                ctx._source.dynamic_price_template.user_id_update=params.dynamic_price_template.user_id_update;
                ctx._source.dynamic_price_template.rules=params.ctx._source.dynamic_price_template.rules;
                """,
            "params": {
              "is_expired_dynamic_price": #[isExpiredDynamicPrice],
              "dynamic_price_template_id": #[dynamicPriceTemplateId],
              "dynamic_price_template_code":#[dynamicPriceTemplate->code],
              "dynamic_price_template.name":#[dynamicPriceTemplate->name],
              "dynamic_price_template.count_products":#[dynamicPriceTemplate->countProducts],
              "dynamic_price_template.is_deleted":#[dynamicPriceTemplate->isDeleted],
              "dynamic_price_template.user_id_update":#[dynamicPriceTemplate->userIdUpdate],
              "dynamic_price_template.rules":
              [
                   #foreach($rule in $dynamicPriceTemplate.rules)
                       #if($velocityCount > 0),#end
                   {
                        "id": #[dynamicPriceTemplate->rules[$velocityCount].id],
                        "sort_num": #[dynamicPriceTemplate->rules[$velocityCount]->sortNum],
                        "act_expired_time_tick": #[dynamicPriceTemplate->rules[$velocityCount]->actExpiredTimeTick],
                        "act_expired_time_value": #[dynamicPriceTemplate->rules[$velocityCount]->actExpiredTimeValue],
                        "act_expired_time_unit": #[dynamicPriceTemplate->rules[$velocityCount]->actExpiredTimeUnit],
                        "price_new_type": #[dynamicPriceTemplate->rules[$velocityCount]->priceNewType],
                        "price_new_coefficient": #[dynamicPriceTemplate->rules[$velocityCount]->priceNewCoefficient],
                        "price_new_custom": #[dynamicPriceTemplate->rules[$velocityCount]->priceNewCustom],
                        "auto_set_commend": #[dynamicPriceTemplate->rules[$velocityCount].autoSetCommend],
                        "auto_set_tag": #[dynamicPriceTemplate->rules[$velocityCount]->autoSetTag]
                    }
                   #end
              ]
            }
          }
        }
        ]]>
    </property>

4 参考资料
https://my.oschina.net/bboss/blog/1556866#h3_37

https://www.elastic.co/guide/en/elasticsearch/painless/6.3/painless-examples.html

elasticsearch技术交流群:166471282

elasticsearch微信公众号:
img_a21db47cf20ac4820026d60bcb2b9470.jpe
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
Web App开发 自然语言处理 API
巧记Elasticsearch常用DSL语法
记知识先记轮廓,关于DSL语法的轮廓,记住以下3句话即可:1.索引、文档和查询。2.Match、Term和Bool。3.还有翻页和聚合
巧记Elasticsearch常用DSL语法
|
存储 关系型数据库 数据库
ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
|
存储 监控 安全
大厂案例 - 腾讯万亿级 Elasticsearch 架构实践1
大厂案例 - 腾讯万亿级 Elasticsearch 架构实践
194 0
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
217 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
3月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
4月前
|
机器学习/深度学习 存储 搜索推荐
Elasticsearch与深度学习框架的集成案例研究
Elasticsearch 是一个强大的搜索引擎和分析引擎,广泛应用于实时数据处理和全文搜索。深度学习框架如 TensorFlow 和 PyTorch 则被用来构建复杂的机器学习模型。本文将探讨如何将 Elasticsearch 与这些深度学习框架集成,以实现高级的数据分析和预测任务。
43 0
|
5月前
|
存储 数据库 索引
面试题ES问题之动态映射的定义如何解决
面试题ES问题之动态映射的定义如何解决
40 1
|
7月前
|
SQL Java 关系型数据库
spring data elasticsearch 打印sql(DSL)语句
spring data elasticsearch 打印sql(DSL)语句
466 0
|
7月前
|
自然语言处理 Java 索引
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)
275 1
|
JSON 自然语言处理 数据格式
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
200 0