elasticsearch 的 update by query 使用案例

 为了优化我的查询时间,我想要跳过嵌套查询和父子关联查询,其实有很多时候我的查询条件,关注的是有没有,而不是 是什么。

 所以我完全可以通过打标签的方式,跳过嵌套查询和父子关联查询。

  举个栗子:我的软件信息是嵌套类型的,而我展示结果的时候想要把带有软件信息的放在前边展示。这个需求里边我并不关注软件的内容,关注的只是有软件信息的。但是我查询条件在做打分排序的时候,我需要对软件的字段进行should,它是嵌套查询的。

  基于以上想法,我想把包含软件信息的打上一个标签:这样我查的时候,只需要对非嵌套类型的标签进行should,跳过了嵌套查询。

  所以用到了这条语句:update_by_query

 为了实现这个需求,我也是努力的查看了官网,但是感觉还是不是很清晰,又问了elasticsearch社区的人。最终把这个语句写出来了!

 但是还有一些问题,下边介绍。先介绍语句。

 先介绍一下使用的两个栗子,基本上也就两种情况了,一种是原来没有值,然后添加值;一种是原来有值,然后修改。

 

# # 情景一:update_by_query,其中update的内容为添加的内容

   为了方便以后扩展,我这个标签是两层。外层是 labels ,第二层是:hasSoftType

POST device_search_20200716/_update_by_query?conflicts=proceed&timeout=1d&&slices=5
{
  
   "script": {
   // labels 是一级字段 params是下边定义的,里边存放着二级字段,和二级字段的值
    "source": "ctx._source.put('labels',params.labels)",
    "lang": "painless",
    "params":{
      "labels":{
        "hasSoftType":"1"
      }
    }
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

# # 情景二:update_by_query,其中update的内容为修改的内容

  执行这个的时候,如果要修改的字段没有内容会报错

POST device_search_20200716/_update_by_query?conflicts=proceed
{
   "script": {
    "source": "ctx._source['labels'].hasSoftType='2';",
    "lang": "painless"
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

 

 # # 情景三:update_by_query,其中update的字段是一级字段,没有嵌套关系

POST device_search_20200716/_update_by_query?conflicts=proceed
{
   "script": {
    "source": "ctx._source['labels']='2';",
    "lang": "painless"
  },
   "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "deviceInfo.deviceType"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "labels.hasSoftType": {
              "value": "1"
            }
          }
        }
      ]
    }
  }
}

 

# # 官网文档上的内容以及需要主义的点

 待整理 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值