Verwijder een veld uit een Elasticsearch-document

Ik moet een veld verwijderen in alle documenten die zijn geïndexeerd in Elasticsearch. Hoe kan ik het doen?


Antwoord 1, autoriteit 100%

Wat @backtrack vertelde is waar, maar er is een erg handige manier om dit te doen in Elasticsearch.
Elasticsearch zal de interne complexiteit van de verwijdering abstraheren.
U moet de update-API gebruiken om dit te bereiken –

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

Meer documentatie vindt u hier.

Opmerking: vanaf Elastic Search 6 moet u een koptekst van het inhoudstype opnemen:

-H 'Content-Type: application/json'

Antwoord 2, autoriteit 40%

Elasticsearch heeft update_by_queryin 2.3. Met deze experimentele interface kunt u de update uitvoeren voor alle documenten die overeenkomen met een zoekopdracht.

Intern elasticsearch scant/scrollt om batches documenten te verzamelen en deze vervolgens bij te werken zoals de bulk-update-interface. Dit is sneller dan handmatig te doen met uw eigen scan/scroll-interface omdat u geen netwerk- en serialisatie-overhead heeft. Elk record moet in het ram worden geladen, gewijzigd en vervolgens worden geschreven.

Gisteren heb ik een groot veld uit mijn ES-cluster verwijderd. Ik zag een aanhoudende doorvoer van 10.000 records per seconde tijdens de update_by_query, beperkt door CPU in plaats van IO.

Bekijk het instellen van conflicts=proceedals het cluster ander updateverkeer heeft, anders stopt de hele taak wanneer een ConflictErrorwordt bereikt wanneer een van de records eronder wordt bijgewerkt een van de batches.

Als je wait_for_completion=falseinstelt, wordt de update_by_query uitgevoerd via de takeninterface. Anders wordt de taak beëindigd als de verbinding wordt verbroken.

url:

http://localhost:9200/INDEX/TYPE/_update_by_query?wait_for_completion=false&conflicts=proceed

POST-tekst:

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

Vanaf Elasticsearch 1.43 is inline groovy scripting standaard uitgeschakeld. Je moet het inschakelen om een ​​inline-script als dit te laten werken door script.inline: truetoe te voegen aan je configuratiebestand.

Of upload de groovy als een script en gebruik de indeling "script": { "file": "scriptname", "lang": "groovy"}.


Antwoord 3, autoriteit 36%

U kunt gebruiken _update_by_query

Voorbeeld 1

index: mijn_index

veld: gebruiker.e-mail

POST my_index/_update_by_query?conflicts=proceed
{
    "script" : "ctx._source.user.remove('email')",
    "query" : {
        "exists": { "field": "user.email" }
    }
}

Voorbeeld 2

index: mijn_index

veld: totaal_items

POST my_index/_update_by_query?conflicts=proceed
{
    "script" : "ctx._source.remove('total_items')",
    "query" : {
        "exists": { "field": "total_items" }
    }
}

Antwoord 4, autoriteit 12%

De vorige antwoorden werkten niet voor mij.

Ik moest het zoekwoord “inline” toevoegen:

POST /my_index/_update_by_query
{
  "script": {
    "inline": "ctx._source.remove(\"myfield\")"
  },
  "query" : {
      "exists": { "field": "myfield" }
  }
}

Antwoord 5, autoriteit 8%

Standaard is het niet mogelijk, want op dit moment ondersteunt Lucene dat niet. In principe kun je hele Lucene-documenten alleen maar verwijderen of verwijderen van Lucene Indices.

  1. Verkrijg de eerste versie van uw Doc
  2. Verwijder het veld
  3. Duw deze nieuwe versie van uw doc

Dit antwoord is geldig voor versie & LT; 5 (

Other episodes