`

ElasticSearch DSL Script使用案例分享

阅读更多
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微信公众号:
1
0
分享到:
评论

相关推荐

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    可以使用Elasticsearch的Java API来构建DSL。 5. **执行查询和结果映射**:在代理类中,使用ES的Java REST客户端执行DSL查询,并将结果映射到相应的Java对象。可以自定义结果映射逻辑,以适应不同的返回类型。 6. ...

    spl2dsl:使用Peg.js将Splunk SPL转换为Elasticsearch DSL

    Splunk-SPL-to-ElasticSearch-DSL 基于 Splunk 的 SPL 查询语言转换成 ElasticSearch 的 DSL。 转换结果和 对齐。 可以配置 进行表达式搜索。 Usage const converter = require("./lib/converter") try { const { ...

    Elasticsearch Painless Script入门教程--示例数据-sat.json

    Elasticsearch Painless Script入门教程--示例数据。 自Elasticsearch 5.x 引入Painless,使得Elasticsearch拥有了安全、可靠、高性能脚本的解决方案。Painless是Elastic开发并做了专门的优化,相较之前的脚本更...

    django-elasticsearch-dsl-drf:将Elasticsearch DSL与Django REST框架集成

    Django Elasticsearch DSL是Django与Elasticsearch之间的一个桥接库,它允许开发者使用DSL来定义Elasticsearch的索引和搜索查询。DSL是一种简洁、直观的语法,使得编写复杂的Elasticsearch查询变得容易。通过这个库...

    elasticSearch查询语句DSL

    在这篇资源中,我们将详细介绍如何使用DSL...最后,我们将分享一些实用技巧和最佳实践,帮助您充分发挥DSL在Elasticsearch中的优势。我们将探讨性能优化、查询调试和索引优化等关键主题,以提升查询效率和搜索准确性。

    JAVA实现ElasticSearch的简单实例

    Java实现Elasticsearch的简单实例主要涉及以下几个关键知识点: 1. **Elasticsearch基础**:Elasticsearch(ES)是一个开源的、分布式全文搜索引擎,它提供了实时数据分析的能力,广泛用于日志分析、监控、搜索应用...

    elasticsearch-sql:使用antlr4将sql解析为elasticsearch dsl

    弹性搜索 建造状态 6.0.0 6.0.1 6.1.0 6.1.1 6.1.2 6.1.3 6.1.4 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.3.0 6.3.1 6.3.2...用antlr4重写elasticsearch ,支持 变更日志 Maven &lt; groupId&gt;io.github.iamazy.elasticsearch.ds

    django-elasticsearch-dsl:这是一个允许在Elasticsearch中使用elasticsearch-dsl-py索引django模型的软件包

    它是作为的薄包装而构建的,因此您可以使用elasticsearch-dsl-py团队开发的所有功能。 您可以在查看完整的文档。特征基于因此您可以使用类进行查询。 Django信号接收器处于保存和删除状态,以保持Elasticsearch同步...

    PyPI 官网下载 | elasticsearch-dsl-5.3.0.tar.gz

    Elasticsearch-DSL库提供了一种更加Pythonic的方式来操作Elasticsearch,它使得开发者可以使用更加结构化和可读性强的代码来执行复杂的查询和操作。该库的核心功能包括: 1. **查询构造**:通过构建类对象的方式,...

    PyPI 官网下载 | django-elasticsearch-dsl-drf-0.13.2.tar.gz

    《PyPI上的django-elasticsearch-dsl-drf-0.13.2.tar.gz:整合Django、Elasticsearch与DRF的利器》 在Python的世界里,开发高效、可扩展的Web应用,Django框架是不可或缺的一部分。而随着大数据时代的发展,对数据...

    elasql:通用SQL到Elasticsearch DSL查询转换器

    通用SQL到Elasticsearch DSL查询转换器。 专为设计 地位 实验性-加入我们,骇客入侵! 安装 npm install elasql 用法 const convert = require('elasql').convert convert('SELECT id,name FROM shop WHERE shop_id...

    Elastic Search搭建使用教程.pdf(内含ElasticSearch教程权威指南)

    Elasticsearch是一款基于Lucene的开源搜索引擎,它使用RESTful接口进行数据操作,数据以JSON格式存储。Elasticsearch以其高效的全文搜索功能,实时数据处理能力,以及易于使用的特性,在众多企业中得到了广泛应用,...

    elasticsearch安装和使用

    使用`/opt/es/essoftware/elasticsearch-2.3.4/bin/plugin install mobz/elasticsearch-head`命令安装,然后通过`http://cm3:9200/_plugin/head/`访问。 2. Marvel和Kibana是Elasticsearch的数据监控和可视化工具。...

    elasticsearch集成spring开发实例

    在现代大数据分析和实时搜索领域,Elasticsearch(简称 ES)已经成为了广泛使用的工具。它是一个分布式、RESTful 风格的搜索和数据分析引擎,能够处理大量数据并提供快速响应。而Spring框架作为Java企业级应用的事实...

    ElasticSQL包将SQL转换为ElasticSearch DSL - farmerx/ ElasticSQL

    ElasticSQL package converts SQL to ElasticSearch DSL SQL Features Support: SQL Select SQL Where SQL Order By SQL Group By SQL AND & OR SQL Like & NOT Like SQL COUNT distinct count(distinct(mid)...

    Python库 | django-elasticsearch-dsl-drf-0.1.6.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:django-elasticsearch-dsl-drf-0.1.6.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Elasticsearch7.0实例精解 源代码.zip

    Elasticsearch 7.0 实例精解源代码是一份深度解析Elasticsearch 7.0版本核心功能和实际应用的资源集合。这份压缩包包含了详细的示例代码,旨在帮助开发者更好地理解和掌握Elasticsearch的强大功能。以下是基于...

    elasticsearch JAVA使用手册

    在Java环境中使用Elasticsearch,通常会涉及到Elasticsearch官方提供的Java客户端库,它允许开发者通过Java代码操作Elasticsearch集群,实现数据的索引、查询、聚合、更新以及删除等操作。Java客户端通过REST API与...

    ElasticSearch分享ppt40页+.pptx

    总的来说,ElasticSearch因其强大的搜索和分析能力、分布式特性及广泛的集成支持,成为Java学习者和技术分享者的重要工具。它不仅适用于日志分析、实时搜索,还广泛应用于监控、物联网、内容管理系统等多个领域。...

Global site tag (gtag.js) - Google Analytics