2017-02-02 2 views
1

Ich habe eine C# -Anwendung, die liest und schreibt in eine ElasticSearch-Datenbank mit NEST. Ich speichere Dokumente vom Typ Dictionary<string, object>ElasticSearch Index Mapping und Platzhalter

Ich setze auch einige Mapping im laufenden Betrieb direkt nach der Erstellung des Indexes. Ich bin es über NEST Anrufe zu tun, siehe unten:

 elastic.Map<Dictionary<string, object>>(m => m 
      .Index(indexName) 
       .Type("DataRecord") 
      .AutoMap().AllField(a => a.Enabled(false)) 
      .Dynamic() 
      .DynamicTemplates(dt => dt 
       .DynamicTemplate("pv_values_template", t => t 
        .Match("ch_*") 
        .Mapping(m2 => m2 
         .Number(n => n 
          .Store(false) 
          .DocValues()))))); 

Der Aufruf ein indexName akzeptiert, die der Name meines Index natürlich ist. Ich tue dies Elasticsearch zu sagen, bestimmte Zuordnungen zu den Dictionary<string, object> Dokumenten zu setzen (nicht im Voraus gemacht werden kann als die Art object ist)

nun in diesem Projekt, das ich speichere Dokumente auf verschiedene Indizes wie:

acme_company_2017 
acme_company_2016 
acme_company_2015 
and so on... 

Jedes Jahr wird ein neuer Index erstellt, das Mapping wird festgelegt und das Speichern von Daten ist immer in Ordnung.

Dann Problem beim Lesen wieder die Dokumente entstehen:

, wenn ich die Dokumente zurückgelesen ich einen speziellen Index verwendet, die ist:

acme_company_* 

So kann ich für all das ganze Zeug abrufen Die Jahre ohne vorher die Jahre zu kennen, bekommen nur alle Daten in der Datenbank gespeichert. Siehe unten:

var dataRecordsArray = elastic.Search<Dictionary<string, object>>(searchDescriptor => searchDescriptor 
      .Index("acme_company_*") 
      .Type("DataRecord") 
      .Query(query => 
       query.Term(dataRecord => dataRecord["GroupId"], groupId) && 
       query.DateRange(dateRangeQueryDescriptor => dateRangeQueryDescriptor 
        .Field(dataRecord => dataRecord["DateTime"]) 
        .GreaterThanWithStartOption(startTime.UtcDateTime, includeStartTime) 
        .LessThanWithEndOption(endTime.UtcDateTime, includeEndTime))) 
        .Size(MaximumNumberOfReturnedDocs) 
        .Sort(dataRecord => dataRecord.Ascending(data => data["DateTime"]))) 
        .Documents.ToArray(); 

Wenn ich das tue, wird der Elasticsearch Motor beschwert, dass der Index I fehlt die Zuordnung ausgewählt. Ich weiß, dass acme_company_* nicht die gleiche Zeichenfolge von acme_company_2017 ist, aber sollte es nicht dasselbe sein, Mapping-weise?

Dies ist der eigentliche Fehler erhalte ich:

Keine Zuordnung für [Datetime], um auf

DateTime ist eine Taste auf dem Dictionary<string, object> Dokument zu sortieren gefunden. Wenn ich das Dokument zurückgelesen habe, wenn ich den gleichen Index zur Verfügung stelle (wie zum Beispiel acme_company_2015) funktioniert alles gut

Bitte beachten Sie, dass das Durchlaufen der Indizes von einem bestimmten Jahr bis zum Ende Jahr (und die Ergebnisse zusammen) ist keine Option, da das System skalierbar sein muss. Darüber hinaus können die Indizes eine kürzere Zeitspanne, wie ein Monat oder sogar weniger

Antwort

2

Ich werde mich hier beantworten,

es stellte mir heraus, dass, wenn acme_company_* ich mit noch einen anderen Satz von Indizes wurde passend ich es nicht täte Erwähnen Sie (dh acme_company_metadata), die die Zuordnung nicht haben.

Die Lösung besteht darin, nur die acme_company_<year> Indizes zu berücksichtigen, ausgenommen acme_company_metadata. Es kann getan werden, die Regex zu straffen, um nur das Jahr

+1

zu passen, froh, dass Sie die Antwort +1 gefunden haben :) –

Verwandte Themen