elasticsearch脚本查询

脚本查询


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

概念

支持的语言

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

特点

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

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


  1. 早先某些版本正则表达式默认情况下处于禁用模式,因为它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战行为。如果需要开启正则,需要配置:script.painless.regex.enabled: true
    注意:通常正则的使用范围比较小,应用范围基本限制在数据量比较小和并发量比较小的应用场景下。

正则:


  1. 理解之间的区别是很重要的,doc['field'].value和params['_source']['field']。首先,使用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[...]符号只允许简单类型(不能返回一个复杂类型(JSON对象或者nested类型)),只有在非分析或单个词条的基础上有意义。但是,doc如果可能,使用仍然是从文档访问值的推荐方式,因为_source每次使用时都必须加载并解析。使用_source非常缓慢
doc['field'].value和params['_source']['field']:
GET product/_doc/1
POST product/_update/1
{
  "script": {
    "source": "ctx._source.price-=1"
  }
}

POST product/_update/1
{
  "script": {
    "source": "ctx._source.price-=ctx._version"
  }
}

GET product/_doc/6
POST product/_update/6
{
  "script": {
    "source": "ctx._source.tags.add('无线充电')"
  }
}

GET product/_doc/11
POST product/_update/11
{
  "script":{
    "source":"ctx.op='delete'"
  }
}

GET product/_search
{
  "query": {
    "match": {
      "_id": "11"
    }
  }
}
DELETE /product/_doc/15
GET product/_doc/15
POST /product/_update/15
{
  "script": {
    "source": "ctx._source.price+=100"
  }
  , "upsert": {
     "name" : "小米手机15",
    "desc" : "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏",
    "price" : 1999,
    "lv" : "旗舰机",
    "type" : "手机",
    "createtime" : "2020-07-27",
    "tags" : [
      "120HZ刷新率",
      "120W快充",
      "120倍变焦",
      "无线充电",
      "无线充电"
    ]
  }
}

GET product/_doc/6
POST product/_update/6
{
  "script": {
    "source": "ctx._source.tags.add(params.tag_name)",
    "params": {
      "tag_name":"有线快充"
    }
  }
}

GET product/_doc/1
POST product/_update/1
{
  "script": {
    "source": "ctx._source.price-=params.num",
    "params": {
      "num":10
    }
  }
}

POST product/_update/1
{
  "script": {
    "source": "ctx._source.price-=params.num",
    "params": {
      "num":10
    }
  }
}

GET product/_search
{
  "query": {
    "match": {
      "_id": 1
    }
  }, 
  "script_fields": {
    "price": {
      "script": {
        "source": "doc['price']"
      }
    },
    "discount":{
      "script": {
        "source": "[doc['price'].value * params.discount9,doc['price'].value * params.discount8,doc['price'].value * params.discount7,doc['price'].value * params.discount6]",
        "params": {
          "discount9":0.9,
          "discount8":0.8,
          "discount7":0.7,
          "discount6":0.6
        }
      } 
    }
  }
}

POST _scripts/discount
{
  "script": {
    "lang": "painless", 
    "source": "doc['price'].value * params.discount"
  }
}

GET _scripts/discount
GET product/_search
{
  "query": {
    "match": {
      "_id": "1"
    }
  }, 
  "script_fields": {
    "dis": {
      "script": {
        "id": "discount",
        "params": {
          "discount":0.9
        }
      }
    }
  }
}
GET product/_doc/7
POST product/_update/7
{
  "script": {
    "source": """
    ctx._source.tags.add(params.tag_name);
    ctx._source.price-=10;
    """,
    "params": {
      "tag_name":"有线快充"
    }
  }
}
POST product/_update/7
{
  "doc":{
    "price":3999
  }
}

PUT test_index/_bulk?refresh
{"index":{"_id":1}}
{"ajbh": "12345","ajmc": "立案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三","NL": "30","SF": "男"},{"XM": "李四","NL": "31","SF": "男"},{"XM": "王五","NL": "30","SF": "女"},{"XM": "赵六","NL": 23,"SF": "男"}]}
{"index":{"_id":2}}
{"ajbh": "563245","ajmc": "结案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三2","NL": "30","SF": "男"},{"XM": "李四2","NL": "31","SF": "男"},{"XM": "王五2","NL": "30","SF": "女"},{"XM": "赵六2","NL": "23","SF": "女"}]}
{"index":{"_id":3}}
{"ajbh": "12345","ajmc": "立案案件","lasj": "2020/05/21 13:25:23","jsbax_sjjh2_xz_ryjbxx_cleaning": [{"XM": "张三3","NL": "30","SF": "男"},{"XM": "李四3","NL": "31","SF": "男"},{"XM": "王五3","NL": "30","SF": "女"},{"XM": "赵六3","NL": "23","SF": "男"}]}


GET test_index/_search
#统计男性嫌疑人的数量
GET test_index/_search
{
  "aggs": {
    "count": {
      "sum": {
        "script": {
          "source": """
          int total = 0;
          for(int i = 0;i<params['_source']['jsbax_sjjh2_xz_ryjbxx_cleaning'].length;i++){
            if(params['_source']['jsbax_sjjh2_xz_ryjbxx_cleaning'][i]['SF'] == '男'){
              total+=1;
            }
          }
          return total;
          """
        }
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值