Elasticsearch-脚本查询

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

脚本查询


  • 概念

    Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强盛的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性能,并且安全可靠,可以用于内联和存储脚本。
  • 支持的语言

    • groovy:ES 1.4.x-5.0的默认脚本语言
    • painless:JavaEE利用java语言开发,.Net利用C#/F#语言开发,Flutter利用Dart语言开发,同样,ES 5.0+版本后的Scripting利用的语言默认就是painless,painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,是ES 5.0+的默认脚本语言,类似于Java,也有注释、关键字、类型、变量、函数等,是一种安全的脚本语言。并且是Elasticsearch的默认脚本语言。
    • 其他
      expression:每个文档的开销较低:表达式的作用更多,可以非常快速地实行,甚至比编写native脚本还要快,支持javascript语法的子集:单个表达式。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用
      mustache:提供模板参数化查询

  • 特点

    • 语法简单,学习成本低
    • 灵活度高,可编程能力强
    • 性能相较于其他脚本语言很高
    • 安全性好
    • 独立语言,虽然易学但仍需单独学习
    • 相较于DSL性能低
    • 不适用于复杂的业务场景

  • 应用场景:各种复杂的应用场景,如自定义评分、自定义聚合查询等。
  • 正则:

    早先某些版本正则表达式默认环境下处于禁用模式,由于它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战活动。如果需要开启正则,需要配置:script.painless.regex.enabled: true
    注意:通常正则的利用范围比力小,应用范围基本限定在数据量比力小和并发量比力小的应用场景下。
  • doc[‘field’].value和params[‘_source’][‘field’]:

    理解之间的区别是很告急的,doc[‘field’].value和params[‘_source’][‘field’]。起首,利用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的实行,但更多的内存斲丧。此外,doc[…]符号只答应简单类型(不能返回一个复杂类型(JSON对象或者nested类型)),只有在非分析或单个词条的底子上有意义。但是,doc如果可能,利用仍然是从文档访问值的推荐方式,由于_source每次利用时都必须加载并解析。利用_source非常痴钝
脚本查询-实战教程

1、对索引中的数据进行修改
  1. 价格减一
  2. POST product/_update/2
  3. {
  4.   "script": {
  5.     "source": "ctx._source.price-=1"
  6.   }
  7. }
  8. 小米10出了新款 新增了tag 叫做“无线充电”
  9. POST product/_update/6
  10. {
  11.   "script": {
  12.     "lang": "painless",
  13.     "source": "ctx._source.tags.add('无线充电')"
  14.   }
  15. }
复制代码
2、将文档从一个索引复制到另一个索引。它答应用户将数据从一个索引重新索引到另一个索引
  1. POST _reindex
  2. {
  3.   "source": {
  4.     "index": "product"
  5.   },
  6.   "dest": {
  7.     "index": "product2"
  8.   }
  9. }
复制代码
3、删除索引中的数据
实行delete操作
  1. POST product/_update/10
  2. {
  3.   "script": {
  4.     "lang": "painless",
  5.     "source": "ctx.op='delete'"
  6.   }
  7. }
复制代码
4、upsert有则更新否则插入
  1. POST product/_update/19
  2. {
  3.   "script": {
  4.     "lang": "painless",
  5.     "source": "ctx._source.price += 100"
  6.   },
  7.   "upsert": {
  8.     "name" : "小米手机10",
  9.     "desc" : "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏",
  10.     "price" : 1999
  11.   }
  12. }
复制代码
5、参数化操作索引数据
  1. POST product/_update/6
  2. {
  3.   "script": {
  4.     "lang": "painless",
  5.     "source": "ctx._source.tags.add(params.tag_name)",
  6.     "params": {
  7.       "tag_name":"无线秒充"
  8.     }
  9.   }
  10. }
复制代码
6、对索引数据进行多次操作
  1. GET product/_search
  2. {
  3.   "script_fields": {
  4.     "price": {
  5.       "script": {
  6.         "lang": "painless",
  7.         "source": "doc['price'].value"
  8.       }
  9.     },
  10.     "discount_price": {
  11.       "script": {
  12.         "lang": "painless",
  13.         "source": "[doc['price'].value* params.discount_8,doc['price'].value* params.discount_7,doc['price'].value* params.discount_6,doc['price'].value* params.discount_5]",
  14.         "params": {
  15.           "discount_8": 0.8,
  16.           "discount_7": 0.7,
  17.           "discount_6": 0.6,
  18.           "discount_5": 0.5
  19.         }
  20.       }
  21.     }
  22.   }
  23. }
复制代码
7、模板脚本
  1. #创建脚本模板
  2. POST _scripts/calculate_discount
  3. {
  4.   "script": {
  5.     "lang": "painless",
  6.     "source": "doc.price.value * params.discount"
  7.   }
  8. }
  9. #查看
  10. GET _scripts/calculate_discount
  11. #使用模板进行数据运算
  12. GET product/_search
  13. {
  14.   "script_fields": {
  15.     "price": {
  16.       "script": {
  17.         "lang": "painless",
  18.         "source": "doc['price'].value"
  19.       }
  20.     },
  21.     "discount_fields": {
  22.       "script": {
  23.         "id": "calculate_discount",
  24.         "params": {
  25.           "discount":0.8
  26.         }
  27.       }
  28.     }
  29.   }
  30. }
复制代码
8、函数式编程
  1. #Scripting的函数式编程
  2. GET product/_search
  3. GET product/_doc/1
  4. POST product/_update/1
  5. {
  6.   "script": {
  7.     "lang": "painless",
  8.     "source": "ctx._source.tags.add(params.tag_name)",
  9.     "params": {
  10.       "tag_name":"无线秒充"
  11.     }
  12.   }
  13. }
  14. POST product/_update/1
  15. {
  16.   "script": {
  17.     "lang": "painless",
  18.     "source": """
  19.       ctx._source.tags.add(params.tag_name);
  20.       ctx._source.price-=100;
  21.     """,
  22.     "params": {
  23.       "tag_name":"无线秒充1"
  24.     }
  25.   }
  26. }
复制代码
9、正则表达式
  1. #正则like %小米% /[\s\S]*小米[\s\S]*/
  2. POST product/_update/4
  3. {
  4.   "script": {
  5.     "lang": "painless",
  6.     "source": """
  7.       if(ctx._source.name ==~ /[\s\S]*小米[\s\S]*/) {
  8.         ctx._source.name+="***|"
  9.       }else{
  10.         ctx.op="noop"
  11.       }
  12.     """
  13.   }
  14. }
  15. #/\d{4}-\d{2}-\d{2}[\s\S]*/
  16. GET product/_doc/1
  17. POST product/_update/1
  18. {
  19.   "script": {
  20.     "lang": "painless",
  21.     "source": """
  22.       if(ctx._source.createtime ==~ /\d{4}-\d{2}-\d{2}[\s\S]*/) {
  23.         ctx._source.name+="|***"
  24.       }else{
  25.         ctx.op="noop"
  26.       }
  27.     """
  28.   }
  29. }
复制代码
10、聚合查询一起利用
  1. GET product/_search
  2. #统计所有价格小于1000的商品的tag的数量 不考虑重复的情况
  3. GET product/_mapping
  4. GET product/_search
  5. {
  6.   "query": {
  7.     "constant_score": {
  8.       "filter": {
  9.         "range": {
  10.           "price": {
  11.             "lte": 1000
  12.           }
  13.         }
  14.       }
  15.     }
  16.   },
  17.   "aggs": {
  18.     "tag_agg": {
  19.       "sum": {
  20.         "script": {
  21.           "lang": "painless",
  22.           "source": """
  23.             int total = 0;
  24.             for(int i = 0; i <doc['tags.keyword'].length; i++){
  25.               total++;
  26.             }
  27.             return total;
  28.           """
  29.         }
  30.       }
  31.     }
  32.   }
  33. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表