Elasticsearch utilise un script pour déterminer si le champ est nul ou non

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
Insérez la description de l'image ici

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

Je suppose que tu aimes

Origine blog.csdn.net/qq_33697094/article/details/109684578
conseillé
Classement