热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elasticsearchpainless最强教程二

painless的正则匹配painless查找操作符painless匹配操作符painlessp

    • painless的正则匹配
    • painless查找操作符
    • painless匹配操作符
    • painless pattern matcher
    • painless CharSequence

在上一篇文章elasticsearch painless最强教程中,已经介绍了一些painless的基本例子,喜欢动脑子的同学应该已经看到了plainless或者说是elasticsearch的script强大之处了。我在另外一篇文章如何使用logstash更新已有的elasticsearch记录里面介绍的用logstash更新数据的功能,在简单的需求下,完全可以用elasticsearch的painless script代替。但为什么我们还需要用logstsah,那是因为在elasticsearch中使用正则表达式去匹配,提取数据以完成数据transformation的功能,其代价是非常昂贵的。

painless除了上篇文章提到的基本功能之外,其实还支持正则表达式。但painless却是默认关闭正则表达式功能的。我们先看看官方是怎么说的:

Regexes are disabled by default because they circumvent Painless’s protection against long running and memory hungry scripts. To make matters worse even innocuous looking regexes can have staggering performance and stack depth behavior. They remain an amazing powerful tool but are too scary to enable by default. To enable them yourself set script.painless.regex.enabled: true in elasticsearch.yml. We’d like very much to have a safe alternative implementation that can be enabled by default so check this space for later developments!

可以看到,painless的最高原则是要运行得快,而用正则表达式去执行搜索的动作则会大量的消耗cpu和内存资源,有可能极大的降低painless的效率,所以官方是默认禁止这个功能的(其实在平时的query中,官方也不建议我们使用regex去搜索)。若要打开,我们必须手动的在elasticsearch的配置文件elasticsearch.yml中加入:

script.painless.regex.enabled: true

读者若要完成下面的例子,上面的这个配置是必须。

painless的正则匹配

painless通过以下的语法结构实现对正则表达式的支持:

  • /pattern/:两个符号内的字面量会创建一个regex的pattern(匹配模式)。这也是painless创建匹配模式的唯一方式。该匹配模式是标准的java正则表达式。并且和其他的脚本语言的正则匹配类似,是可以带flag的。
    Character Java Constant Example

    c

    CANON_EQ

    'å' ==~ /å/c (open in hex editor to see)

    i

    CASE_INSENSITIVE

    'A' ==~ /a/i

    l

    LITERAL

    '[a]' ==~ /[a]/l

    m

    MULTILINE

    'a\nb\nc' =~ /^b$/m

    s

    DOTALL (aka single line)

    'a\nb\nc' =~ /.b./s

    U

    UNICODE_CHARACTER_CLASS

    'Ɛ' ==~ /\w/U

    u

    UNICODE_CASE

    'Ɛ' ==~ /ɛ/iu

    x

    COMMENTS (aka extended)

    'a' ==~ /a #comment/x

  • =~: 查找操作符。如果文本的某个部分被匹配,则返回true,否则返回false。
  • ==~: 匹配操作符。如果文本整体匹配,则返回true,否则返回false。

painless查找操作符

我们可以通过查找操作符,寻找所有last名字里面包含有字面’b’的球员,并加上后缀match,反之,跳过。注意这里,=~是不要求整体匹配的,是一个类似于java里contain()的操作。
这里写图片描述
这里需要注意,无论是=~还是==~,左右两边一个是text,一个是pattern,只返回true or false.

painless匹配操作符

通过匹配操作符, 你可以精确的找到所有球员中名字以元音字母开头和结尾的人。
如下图,仅匹配到一人。
这里写图片描述
这里需要注意,无论是=~还是==~,左右两边一个是text,一个是pattern,只返回true or false。

painless pattern matcher

我们使用正则匹配,除了搜索,还经常会用到提取或替换的场景。这时,我们就需要使用pattern的matcher功能。
下图中,我们就用matcher的功能删除了所有球员last name中的元音字母。
这里写图片描述
这里只需要注意和上面提到的操作符不同的地方。我们是通过/pattern/.matcher(text).replaceAll的方式来实现提取与转换的。因为底层是java的函数与实现,我们还可以用很熟悉的$1\2的方式提取匹配项。比如:

POST hockey/player/_update_by_query
{
"script": {
"lang": "painless",
"inline": "ctx._source.last = /n([aeiou])/.matcher(ctx._source.last).replaceAll('$1')"
}
}

painless CharSequence

我们还可以在painless中使用charSequencereplaceAll()方法来进行更高级的提取和转换操作。因为该方法支持传入lambda表达式进行更高级的转换。例如:

POST hockey/player/_update_by_query
{
"script": {
"lang": "painless",
"inline": "ctx._source.last = ctx._source.last.replaceAll(/[aeiou]/, m -> m.group().toUpperCase(Locale.ROOT))"
}
}

在上例中,我们将所有的元音字母都转成大写。当然,如果你只想把第一个碰到的元音字母换成大写,可以用m -> m.group(1).toUpperCase(Locale.ROOT)的方式。也可以用replaceFirst函数:

POST hockey/player/_update_by_query
{
"script": {
"lang": "painless",
"inline": "ctx._source.last = ctx._source.last.replaceFirst(/[aeiou]/, m -> m.group().toUpperCase(Locale.ROOT))"
}
}

具体painless里面支持哪些函数可以查看白名单


推荐阅读
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • Java设计模式详解:解释器模式的应用与实现
    本文详细介绍了Java设计模式中的解释器模式,包括其定义、应用场景、优缺点以及具体的实现示例。通过音乐解释器的例子,帮助读者更好地理解和应用这一模式。 ... [详细]
  • 题目描述:给定一个区间,支持两种操作:1. 将位置a的值修改为b;2. 查询区间[a, b]内的子序列的最大和,其中子序列中相邻的元素必须具有不同的奇偶性。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍了如何在 Vue 3 组合 API 中正确设置 setup() 函数的 TypeScript 类型,以避免隐式 any 类型的问题。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
author-avatar
郑雅琳RaeiHh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有