Lorsque vous utilisez es pour effectuer récemment les opérations de mise à jour suivantes:
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"
}
}
}
Description du script: interrogez d'abord le document dont data_type est 1 et customer_id est 101320130050, puis si le tableau du document customer_group ne contient pas 22347, ajoutez 22347 à customer_group.
Erreur d'exécution:
méthode dynamique [java.lang.String, add / 1] pas fond
Plus tard, la raison de l'enquête était que le customer_group était vide ou que l'élément du tableau était 0 . En termes simples, le document dont data_type est 1 et customer_id est 101320130050 n'a pas le champ customer_group, ou il n'y a pas d'élément dans le tableau customer_group, tout comme "customer_group": []
En recherchant les informations, on constate que es utilise un script pour déterminer qu'il est vide et que l'élément est égal à 0. Vous pouvez l'écrire comme ceci:
ctx._source.customer_group==null||ctx._source.customer_group?.size() ==0
或者:
ctx._source.customer_group==null||ctx._source.customer_group.length==0
L'instruction DSL modifiée est la suivante:
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"
}
}
}
Description du script: Si customer_group est vide ou que les éléments qu'il contient sont 0, affectez 22347 directement à customer_group, sinon, si customer_group ne contient pas 22347, ajoutez 22347 à customer_group.
D'autres sur Internet, comme par exemple à en juger par doc ['xxx']. Length ou doc ['fieldname']. Values.length, ont échoué au test, ce qui peut être lié à différentes versions de es:
"script": {
"source": "doc['xxx'].length==0",
"lang": "painless"
}
En ce qui concerne le script d'elasticsearch pour déterminer si le champ est vide et la taille de l'élément, reportez-vous à d'autres URL:
elasticsearch filtrage par la taille d'un champ qui est un tableau
elasticsearch filtre par la longueur d'un champ de chaîne
Requête de scriptedit