Ich muss einige Indexfelder mit formatierten Strings füllen, indem ich die Daten anderer Indexfelder konvertiere. Um dies zu tun, habe ich eine Ingest-Pipeline definiert, die einen Skriptprozessor enthält. Alles kompiliert; Beim Indizieren werden die Zielfelder jedoch nicht mit Werten gefüllt.Elasticsearch: Knoten aufnehmen - Skriptprozessor zum Auffüllen von Indexfeldern verwenden
Index:
PUT my_index
{
"mappings": {
"product": {
"properties": {
"product_name": {"type": "text", "index": true},
"formatted_product_name": {"type": "keyword", "index": true},
"production_date": {"type": "keyword", "index": "true"},
"formatted_date": {"type": "keyword", "index": "true"}
}
}
}
}
Mit diesem Beispiel Index an Hand würde ich die Felder formatted_product_name
und formatted_date
bevölkert von der Ingest Pipeline Logik erhalten möchte.
Ingest Pipeline (ohne wirkliche Logik):
PUT _ingest/pipeline/product_data_preprocessing
{
"processors" : [
{"script": {
"lang": "painless",
"inline": "def source_fields = [ctx.product_name, ctx.production_date]; def target_fields = [ctx.formatted_product_name, ctx.formatted_date]; for(def i=0; i<source_fields.length; i++) { target_fields[i] = source_fields[i]; }"
}}
]
}
Daten:
PUT _bulk?pipeline=product_data_preprocessing
{"index": {"_index": "my_index", "_type": "product", "_id": "1"}}
{"product_name": "ipad", "production_date": "2017-02-17"}
{"index": {"_index": "my_index", "_type": "product", "_id": "2"}}
{"product_name": "tv", "production_date": "2017-10-07"}
Abfrage:
GET my_index/product/_search
{
"query": {
"match_all": {}
}
}
Bemerkung: die folgende Pipeline funktioniert. Aber das würde nicht skalieren. Daher suche ich nach einer Möglichkeit, eine Reihe von Zielfeldern zu füllen, indem ich die Werte einiger Quellindexfelder auf dynamische Weise verarbeite.
PUT _ingest/pipeline/product_data_preprocessing
{
"processors" : [
{"script": {
"lang": "painless",
"inline": "ctx.formatted_date = ctx.production_date"
}}
]
}
So gibt es eine Möglichkeit, ein (schmerzfrei) Skript in einem ingest Pipelineprozessor zu definieren, dynamisch einen Satz von Indexfeldern zu füllen, indem eine Reihe von Quellfeldern und eine Reihe von Zielfeldern und entsprechender Verarbeitungslogik definierte?
Sie sein Vielen Dank für Ihre Mühe. Das Problem ist nicht der Textmanipulationsteil, sondern wie man eine Sammlung von Indexfeldern erstellt und wie man mit ihnen arbeitet. –