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_query
in 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=proceed
als het cluster ander updateverkeer heeft, anders stopt de hele taak wanneer een ConflictError
wordt bereikt wanneer een van de records eronder wordt bijgewerkt een van de batches.
Als je wait_for_completion=false
instelt, 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: true
toe 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.
- Verkrijg de eerste versie van uw Doc
- Verwijder het veld
- Duw deze nieuwe versie van uw doc
Dit antwoord is geldig voor versie & LT; 5 (