elasticsearch使用script判断字段是否为空null

最近在使用es进行如下更新操作时:

POST customer/customer_info/_update_by_query
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "data_type": {
              "value": 1
            }
          }
        },
        {
          "terms": {
            "customer_id": [
              "101320130050"
            ]
          }
        }
      ]
    }
  },
  "script": {
    "source": """
         if(!ctx._source.customer_group.contains(params.val)) {
              ctx._source.customer_group.add(params.val)
          }""",
    "params": {
      "val": "22347"
    }
  }
}

script说明:先查询出data_type是1并且customer_id是101320130050的文档,然后如果这个文档的数组customer_group里不包含22347则把22347加到customer_group里。

运行报错:
dynamic method [java.lang.String,add/1] not fond
在这里插入图片描述

后来排查原因是因为customer_group是空或者数组元素是0导致的。简单说就是data_type是1并且customer_id是101320130050的这个文档没有customer_group这个字段,或者customer_group数组里面一个元素也没有导致的,就像是样"customer_group":[ ]

查阅资料发现,es使用script来判断为空和元素等于0可以这样写:

ctx._source.customer_group==null||ctx._source.customer_group?.size() ==0
或者:
ctx._source.customer_group==null||ctx._source.customer_group.length==0

修改后的dsl语句如下:

POST customer_v2023/customer_info/_update_by_query
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "data_type": {
              "boost": 1,
              "value": 1
            }
          }
        },
        {
          "terms": {
            "boost": 1,
            "customer_id": [
              "101320130050"
            ]
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "script": {
    "source": """
 if(ctx._source.customer_group==null||ctx._source.customer_group?.size() ==0) {
        ctx._source.customer_group=[params.val]
      } else if(!ctx._source.customer_group.contains(params.val)) {
        ctx._source.customer_group.add(params.val)
      }
""",
    "params": {
      "val": "22347"
    }
  }
}

script说明: 如果customer_group为空或里面元素为0则将22347直接赋值给customer_group,否则如果customer_group不包含22347则将22347加入到customer_group。

网上其他的如通过doc[‘xxx’].length或doc[‘fieldname’].values.length来判断经过测试没能成功,可能和es的不同版本有关:

   "script": {
          "source": "doc['xxx'].length==0",
          "lang": "painless"
   }

关于elasticsearch的script判断字段是否为空以及元素的大小判断参考的其他网址:

elasticsearch filtering by the size of a field that is an array
elasticsearch filter by length of a string field
Script queryedit

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想删除 ES 索引中的某个文档的 script 字段的参数内容,可以使用如下的 CURL 命令: ``` curl -X POST "localhost:9200/index_name/_update/doc_id" -H 'Content-Type: application/json' -d' { "script": { "source": "ctx._source.remove(\"script_field_name\")" } } ' ``` 其中,`index_name` 是您的索引名称,`doc_id` 是要更新的文档的 ID,`script_field_name` 是要删除的 script 字段的参数名称。执行该命令后,该文档中的 script 字段的参数内容将被删除。 ### 回答2: es script字段可以通过脚本语言来操作和修改文档中的字段内容,包括删除字段的内容。在es中,可以使用脚本语言如painless来删除文档字段的内容。 使用es的update api来更新文档,可以在请求体中设置script字段来执行脚本操作。在script字段中,可以使用painless脚本语言编写相应的代码来删除字段内容。 例如,假设有一个名为"my_field"的字段,我们想要删除它的内容,可以通过以下代码来实现: ``` POST /index_name/_update/document_id { "script": { "source": "ctx._source.my_field = null" } } ``` 在以上代码中,"index_name"是索引的名称,"document_id"是要更新的文档的ID。在script字段的source属性中,我们将my_field字段的值设置为null,即删除其内容。 执行以上请求后,es会找到相应的文档并执行脚本,将my_field字段的内容删除。 需要注意的是,要使用script字段来更新文档,需要在es的配置文件中打开相应的脚本功能。否则,默认情况下是禁止使用脚本的。 总之,通过设置es的script字段,我们可以使用脚本语言来删除文档中字段的内容,从而实现对文档的灵活操作。 ### 回答3: es script字段是用于执行脚本的字段,可以在文档索引时对字段进行动态操作。通过使用script字段,我们可以实现对字段的删除。在删除参数内容时,可以使用如下示例代码: ``` POST /my_index/_update/<doc_id> { "script" : { "source": "ctx._source.remove('field_name')" } } ``` 在上述代码中,我们使用了update API来更新文档。`<doc_id>`是需要被更新的文档的ID。在script字段中,我们使用了`ctx._source.remove('field_name')`来删除指定字段的内容。 其中,`ctx._source`是指向当前文档源的指针,可以通过它来对文档进行修改。`remove('field_name')`表示删除指定字段的内容。 需要注意的是,如果要删除的字段不存在,脚本将不会产生任何效果,也不会引发错误。 最后,执行上述请求后,指定字段的内容就会被删除。 以上就是使用es script字段删除参数内容的方法,通过将上述代码适用于具体的环境和需求,即可实现删除指定字段内容的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值