2016-09-21 3 views
0

Ich wollte nur wissen, wenn jemand weiß, wie ein Null-Wert für ein ElasticSearch-Datum-Feld bereitzustellen.NULL-Wert für elasticsearch Datum Feld

Sie können auf dem Screenshot unten sehen, dass es möglich ist, eine DateTime für den Nullwert zu verwenden, aber wenn ich es versuche, akzeptiert es es nicht. Die Fehlermeldung wird ausgegeben:

"'NullValue' ist kein gültiges benanntes Attribut-Argument, da es kein gültiger Attribut-Parameter-Typ ist."

Date field options

Antwort

1

Da NullValue für DateAttribute ist ein DateTime, kann es nicht sein, setzt auf ein Attribut, das auf eine POCO-Eigenschaft angewendet wird, da der Set-Wert eine Kompilierzeitkonstante sein muss. Dies ist eine der Einschränkungen des Attributansatzes für das Mapping.

NullValue kann in ein paar Möglichkeiten eingestellt werden:

Mit der fließend API

Die fließend Mapping kann alles, was Mapping-Attribut, sowie Griff Funktionen wie Nullwerte tun können, multi_fields usw.

public class MyDocument 
{ 
    public DateTime DateOfBirth { get; set; } 
} 

var fluentMappingResponse = client.Map<MyDocument>(m => m 
    .Index("index-name") 
    .AutoMap() 
    .Properties(p => p 
     .Date(d => d 
      .Name(n => n.DateOfBirth) 
      .NullValue(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)) 
     ) 
    ) 
); 

Mit einem Besuchermuster

Definieren Sie einen Besucher, der alle Eigenschaften in der POCO aufruft, und verwenden Sie dies, um einen Nullwert festzulegen. Das Besuchermuster ist nützlich, um Konventionen auf Ihr Mapping anzuwenden. Beispielsweise sollten alle String-Eigenschaften ein multi_field mit einem nicht analysierten rohen Subfeld sein.

public class MyPropertyVisitor : NoopPropertyVisitor 
{ 
    public override void Visit(IDateProperty type, PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute) 
    { 
     if (propertyInfo.DeclaringType == typeof(MyDocument) && 
      propertyInfo.Name == nameof(MyDocument.DateOfBirth)) 
     { 
      type.NullValue = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
     } 
    } 
} 

var visitorMappingResponse = client.Map<MyDocument>(m => m 
    .Index("index-name") 
    .AutoMap(new MyPropertyVisitor()) 
); 

sowohl die fließend Mapping und Besucher folgende Anfrage

{ 
    "properties": { 
    "dateOfBirth": { 
     "null_value": "1970-01-01T00:00:00Z", 
     "type": "date" 
    } 
    } 
} 

Take a look at the automapping documentation for more information.

+0

erzeugen, die eine große Antwort ist es Ihnen danken! Ich fing an zu denken, dass es wegen der Herangehensweise sein könnte, die ich benutzte, deshalb fuhr ich fort und setzte den Nullwert unter Verwendung der fließenden API. Ich denke, es ist nützlich, dies für zukünftige Referenz zu berücksichtigen. Vielen Dank für Ihre Hilfe – GSkidmore

+0

@GSkidmore - keine Sorgen, glücklich zu helfen :) –

0

einfach den folgenden Code verwendet, anstatt sie auf die Klasse Datum Attribut erklärt:

.Properties(pr => pr 
 
    .Date(dt => dt 
 
    .Name(n => n.dateOfBirth) 
 
    .NullValue(new DateTime(0001, 01, 01))))

Verwandte Themen