painless语法入门[通俗易懂]

painless语法painless基础结构”script”:{“lang”:”…”,”source”|”id”:”…”,”params”:{…}}lang:定义脚本使用的语言,默认painlesssource,id:脚本的主体,source后面跟着内联的脚本代码,id后面跟着脚本的id,具体代码存在于脚本id对应的代码中params:定义一些变量的值,使用params可以减少脚本的编译次数.因为如果

大家好,又见面了,我是你们的朋友全栈君。

painless语法

painless基础结构


  "script": { 
   
    "lang":   "...",
    "source" | "id": "...",
    "params": { 
    ... }
  }
  1. lang: 定义脚本使用的语言, 默认painless
  2. source, id: 脚本的主体, source后面跟着内联的脚本代码, id后面跟着脚本的id, 具体代码存在于脚本id对应的代码中
  3. params: 定义一些变量的值, 使用params可以减少脚本的编译次数. 因为如果变量的值硬编码到代码中, 每次进行变量值得更改都会对脚本进行重新编译. 使用params则不会重新编译脚本.

script.context.field.max_compilations_rate=75/5m 脚本的默认编译频率, 定义脚本的编译频率为5分钟75个, 当超过75个时会抛出circuit_breaking_exception异常.

脚本代码的存储

// POST _scripts/{id}
POST _scripts/calculate-score
{ 
   
  "script": { 
   
    "lang": "painless",
    "source": "Math.log(_score * 2) + params['my_modifier']"
  }
}

// 脚本使用
GET my-index-000001/_search
{ 
   
  "query": { 
   
    "script_score": { 
   
      "query": { 
   
        "match": { 
   
            "message": "some message"
        }
      },
      "script": { 
   
        "id": "calculate-score", 
        "params": { 
   
          "my_modifier": 2
        }
      }
    }
  }
}

使用脚本对文档进行更新


PUT my-index-000001/_doc/1
{ 
   
  "counter" : 1,
  "tags" : ["red"]
}

// 将count加上4
POST my-index-000001/_update/1
{ 
   
  "script" : { 
   
    "source": "ctx._source.counter += params.count",
    "lang": "painless",
    "params" : { 
   
      "count" : 4
    }
  }
}

// 增加tags的元素
POST my-index-000001/_update/1
{ 
   
  "script": { 
   
    "source": "ctx._source.tags.add(params['tag'])",
    "lang": "painless",
    "params": { 
   
      "tag": "blue"
    }
  }
}

// If the list contains duplicates of the tag, this script just removes one occurrence.
// 如果集合中有多个相同的值, 只删除第一个
POST my-index-000001/_update/1
{ 
   
  "script": { 
   
    "source": "if (ctx._source.tags.contains(params['tag'])) { ctx._source.tags.remove(ctx._source.tags.indexOf(params['tag'])) }",
    "lang": "painless",
    "params": { 
   
      "tag": "blue"
    }
  }
}

// 增加新的字段
POST my-index-000001/_update/1
{ 
   
  "script" : "ctx._source.new_field = 'value_of_new_field'"
}

// 删除字段
POST my-index-000001/_update/1
{ 
   
  "script" : "ctx._source.remove('new_field')"
}

// 如果tags字段中包含green, 则删除该文档, 否则不做操作
POST my-index-000001/_update/1
{ 
   
  "script": { 
   
    "source": "if (ctx._source.tags.contains(params['tag'])) { ctx.op = 'delete' } else { ctx.op = 'none' }",
    "lang": "painless",
    "params": { 
   
      "tag": "green"
    }
  }
}

// doc.containsKey('field')

脚本变量

  • ctx._source.field: add, contains, remove, indexOf, length
  • ctx.op: The operation that should be applied to the document: index or delete
  • ctx._index: Access to document metadata fields
  • _score 只在script_score中有效
  • doc[‘field’], doc[‘field’].value: add, contains, remove, indexOf, length

脚本缓存

  1. You can change this behavior by using the script.cache.expire setting. Use the script.cache.max_size setting to configure the size of the cache.The size of scripts is limited to 65,535 bytes. Set the value of script.max_size_in_bytes to increase that soft limit.
  2. Cache sizing is important. Your script cache should be large enough to hold all of the scripts that users need to be accessed concurrently.

脚本优化

  1. 使用脚本缓存, 预先缓存可以节省第一次的查询时间
  2. 使用ingest pipeline进行预先计算
  3. 相比于_source.field_name使用doc[‘field_name’]语法速度更快, doc语法使用doc value , 列存储

// 根据分数相加结果进行排序
GET /my_test_scores/_search
{ 
   
  "query": { 
   
    "term": { 
   
      "grad_year": "2099"
    }
  },
  "sort": [
    { 
   
      "_script": { 
   
        "type": "number",
        "script": { 
   
          "source": "doc['math_score'].value + doc['verbal_score'].value"
        },
        "order": "desc"
      }
    }
  ]
}

// 在索引中新加一个字段存储计算结果
PUT /my_test_scores/_mapping
{ 
   
  "properties": { 
   
    "total_score": { 
   
      "type": "long"
    }
  }
}

// 使用ingest pipeline先将计算结果作为值存储起来
PUT _ingest/pipeline/my_test_scores_pipeline
{ 
   
  "description": "Calculates the total test score",
  "processors": [
    { 
   
      "script": { 
   
        "source": "ctx.total_score = (ctx.math_score + ctx.verbal_score)"
      }
    }
  ]
}

// 重新索引时使用ingest pipeline
POST /_reindex
{ 
   
  "source": { 
   
    "index": "my_test_scores"
  },
  "dest": { 
   
    "index": "my_test_scores_2",
    "pipeline": "my_test_scores_pipeline"
  }
}

// 索引新文档时使用ingest pipeline
POST /my_test_scores_2/_doc/?pipeline=my_test_scores_pipeline
{ 
   
  "student": "kimchy",
  "grad_year": "2099",
  "math_score": 1200,
  "verbal_score": 800
}

// 查询
GET /my_test_scores_2/_search
{ 
   
  "query": { 
   
    "term": { 
   
      "grad_year": "2099"
    }
  },
  "sort": [
    { 
   
      "total_score": { 
   
        "order": "desc"
      }
    }
  ]
}


// stored field 用法
PUT my-index-000001
{ 
   
  "mappings": { 
   
    "properties": { 
   
      "full_name": { 
   
        "type": "text",
        "store": true
      },
      "title": { 
   
        "type": "text",
        "store": true
      }
    }
  }
}

PUT my-index-000001/_doc/1?refresh
{ 
   
  "full_name": "Alice Ball",
  "title": "Professor"
}

GET my-index-000001/_search
{ 
   
  "script_fields": { 
   
    "name_with_title": { 
   
      "script": { 
   
        "lang": "painless",
        "source": "params._fields['title'].value + ' ' + params._fields['full_name'].value"
      }
    }
  }
}

用到脚本的命令

  • function_score
  • script_score
  • aggregation
  • rescore
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125872.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Mybatis拦截器

    Mybatis拦截器一Mybatis拦截器介绍    Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。通过Mybatis拦截器我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。所以Mybatis拦截器的使用范围是…

  • ip addr命令详解_c++中add是什么意思

    ip addr命令详解_c++中add是什么意思OverviewTheipcommandisaLinuxnet-toolforsystemandnetworkadministators.TheipcommandreplacesoldgoodandnowdeprecatedifconfigcommandonmodernLinuxdistributions.用法ip[options]OBJECTCOMMANDipaddr#查看ipethomeansEthernet,wl..

  • stringutils中的isempty和isblank_java stringbuilder和stringbuffer

    stringutils中的isempty和isblank_java stringbuilder和stringbuffer主要的区别在于“空格”判断isNotEmpty(”空格”)=>true isNotBlank(”空格”)=>falseisNotEmpty(str)等价于str!=null&&str.length>0isNotBlank(str)等价于str!=null&&str.length>0&am…

  • Java—java.util.calendar类详解「建议收藏」

    Java—java.util.calendar类详解「建议收藏」目录一、概述二、静态常量三、静态方法四、实例五、GregorianCalendar类一、概述java.util.Calendar类是一个抽象类,是java日期处理的核心类之一。Calendar类为操作日历字段,及其与特定瞬间之间的转换提供了方法。日历字段包含YEAR、MONTH、DAY_OF_MONTH、HOUR等,它们都是Calendar类的静态常量。二、静态常量…

  • 菲尼克斯PSR-SCP- 24DC/FSP2/2X1/1X2耦合继电器

    菲尼克斯PSR-SCP- 24DC/FSP2/2X1/1X2耦合继电器菲尼克斯PSR-SCP-24DC/FSP2/2X1/1X2耦合继电器耦合继电器-PSR-SCP-24DC/FSP2/2X1/1X22986575适用于SIL2高需求和低需求应用的安全耦合继电器,将数字输出信号耦合至I/O端,2个启动电流通路,1个报警触点,用于安全状态关闭应用的模块,内置测试脉冲滤波器,插拔式螺钉连接端子,宽度:17.5mm产品类型 耦合继电器应用 安全关闭高要求低要求机械寿命 10×106开关次数继电器型号 带机械联锁触点的机电式继电器,符合IEC/EN6

  • 原创 子网划分的讲解 例题加思路

    原创 子网划分的讲解 例题加思路转载于:https://www.cnblogs.com/dsab/p/7425630.html

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号