Supprimer un champ d'un document Elasticsearch

J'ai besoin de supprimer un champ dans tous les documents indexés sur Elasticsearch . Comment puis-je le faire. Est-ce que l'une des requêtes de suppression m'aidera à y parvenir.

23
demandé sur Jalal 2015-03-12 08:03:54

3 réponses

Ce que @ backtrack a dit est vrai, mais il existe un moyen très pratique de le faire dans Elasticsearch. Elasticsearch résumera la complexité interne de la suppression. Vous devez utiliser update API pour y parvenir -

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.remove(\"name_of_field\")"
}'

Vous pouvez trouver plus de documentation ici.

Remarque: depuis Elastic Search 6, Vous devez inclure un en-tête content-type:

-H 'Content-Type: application/json'
30
répondu Vineeth Mohan 2018-09-11 09:38:08

Elasticsearch ajouté update_by_query dans 2.3. Cette interface expérimentale vous permet de faire la mise à jour sur tous les documents qui correspondent à une requête.

En interne, elasticsearch effectue une analyse / défilement pour collecter des lots de documents, puis les mettre à jour comme l'interface de mise à jour en bloc. C'est plus rapide que de le faire manuellement avec votre propre interface scan/scroll en raison de ne pas avoir la surcharge du réseau et de la sérialisation. Chaque enregistrement doit être chargé dans la ram, modifié puis écrire.

Hier, j'ai supprimé un grand champ de mon cluster ES. J'ai vu un débit soutenu de 10 000 enregistrements par seconde pendant update_by_query, contraint par CPU plutôt que par E / S.

Regardez dans la configuration conflict=proceed si le cluster a un autre trafic de mise à jour, ou tout le travail s'arrêtera quand il atteint un ConflictError lorsque l'un des enregistrements est mis à jour sous l'un des lots.

De même, le réglage {[5] } entraînera l'exécution de update_by_query via l'interfacetasks . Sinon, le travail se terminera si la connexion est fermée.

Url:

http://localhost:9200/type/_update_by_query?wait_for_completion=false&conflict=proceed

Corps de courrier:

{
  "script": ctx._source.remove("name_of_field"),
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "name_of_field"
          }
        }
      ]
    }
  }
}

Depuis Elasticsearch 1.43, le script inline groovy est désactivé par défaut . Vous devrez l'activer pour qu'un script en ligne comme celui-ci fonctionne en ajoutant script.inline: true à votre fichier de configuration.

Ou téléchargez le groovy en tant que script et utilisez le format "script": { "file": "scriptname", "lang": "groovy"}.

18
répondu spazm 2016-10-05 23:49:30

Par défaut, ce n'est pas possible, car actuellement Lucene ne supporte pas cela. Fondamentalement, vous ne pouvez mettre ou supprimer des documents Lucene entiers à partir d'indices Lucene.

  1. Obtenez la première version de votre document
  2. supprimer le champ
  3. poussez cette nouvelle version de votre doc
6
répondu Backtrack 2015-03-12 05:17:41