2017-02-21 1 views
1

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?

Antwort

0

Ich habe gesucht, wie ein count-Feld mit einer Ingest-Pipeline hinzufügen und kam auf Ihre Frage. Nach vielen Versuchen habe ich eine Pipeline geschrieben, die einen String mit Zeilenumbrüchen teilt und dann ein Feld für die Anzahl der Einträge im geteilten Array hinzufügt. Nicht sicher, ob es hilft, aber hier ist es sowieso

{ 
    "description" : "split content from Tika into rows", 
    "processors" : [ 
    { 
     "gsub": { 
     "field": "content", 
     "pattern": "\\t+", 
     "replacement": " " 
     } 
    }, 
    { 
     "split": { 
     "field": "content", 
     "separator": "\\n" 
     } 
    }, 
    { 
     "script": { 
     "inline": "ctx.nrows = ctx.content.size()" 
     } 
    } 
    ] 
} 

Beachten Sie, dass ctx.content wird das Ergebnis der vorherigen 2 Prozessoren

+1

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. –

Verwandte Themen