2016-04-15 23 views
1

Ich bin neu in Elasticsearch und Nest und in einem Problem blockiert. Ich möchte einen Index erstellen und ein Dokument mit verschachtelten Feldern indizieren.Elasticsearch Nest 2.x Index verschachteltes Objekt

[ElasticsearchType] 
public class TestType 
{ 
    [Nest.String(Store = true, Index = FieldIndexOption.Analyzed)] 
    public string Text { get; set; } 

    [Nested(IncludeInAll = true)] 
    public List<NestedTestType> Nests { get; set; } = new List<NestedTestType>(); 

    public string Id { get; set; }  
} 

[ElasticsearchType] 
public class NestedTestType 
{ 
    [Nest.String(Store = true, Index = FieldIndexOption.Analyzed)] 
    public string Value { get; set; } 

    [Nest.String(Store = false)] 
    public string NotStoredValue { get; set; } 
} 

und in der Funktion ist es

  var connectionPool = new Elasticsearch.Net.SniffingConnectionPool(poolUris); 
     var settings = new ConnectionSettings(connectionPool); 
     client = new ElasticClient(settings); 

     string testIndexName = "test"; 
     var createIndeReponse = client.CreateIndex(testIndexName); 
     var mappingResponse = client.Map<TestType>(m => m.Index(testIndexName).AutoMap()); 
     mappingResponse = client.Map<NestedTestType>(m => m.Index(testIndexName).AutoMap()); 

     TestType testData = new TestType() { Text = "Hello world" }; 
     testData.Nests.Add(new NestedTestType() { Value = "In the list", NotStoredValue = "Not stored"}); 

     IndexRequest<TestType> indexRequest = new IndexRequest<TestType>(testIndexName, "test_type"); 
     indexRequest.Document = testData; 
     IIndexResponse iir = client.Index(indexRequest); 

jedoch das IIR in der letzten Zeile enthält einen Fehler „Objektzuordnung [Nestern] kann nicht geändert werden von verschachtelt auf nicht-verschachtelte“

Meine Fragen sind:

Was ist der richtige Weg, um die Indizierung zu tun? Wo finde ich Dokumentationen, die mir weiterhelfen?

+0

Sie Mai teilen können Index-Mapping (http: // localhost: 9200/test/_mapping)? – Rob

Antwort

3

Einige Beobachtungen:

  • Die Typnamen für beide TestType und NestedTestType werden von den CLR Typnamen abgeleitet werden. Standardmäßig sind dies die Versionen des Typs "camel case", d. H. testType bzw. nestedTestType.

  • Da NestedTestType eine verschachtelte Art auf TestType ist, brauchen Sie nicht eine Zuordnung separat für sie in dem Index hinzuzufügen; die Abbildung von NestedTestType ist Teil der Abbildung von TestType

  • Sie keinen Wert für die Id von TestType angeben; NEST will infer the id of the document from the Id property welches Null sein wird; Elasticsearch ist damit einverstanden und erzeugt eine eindeutige ID für das Dokument, die es im Feld _id speichert. Diese eindeutige ID wird jedoch nicht auf die Id-Eigenschaft in _source gesetzt, was bedeutet, dass es keine einfache Methode zum Abrufen dieses Dokuments mit ID geben würde NEST-Konventionen. Ich würde empfehlen, einen Wert für Id Einstellung und Kartierung auch das Feld als not_analyzed

Der Grund für den Fehler ist, dass, wenn TestType Indexieren Sie den Typnamen angeben test_type zu sein, wie ausdrücklich im Gegensatz zu testType oder einfach nur die Angabe Lass NEST es für dich schließen.

Wenn Elasticsearch das json Dokument sieht in den kommenden, nicht assoziieren sie nicht mit dem Mapping für TestType, die seit den Typnamen zuvor erstellt wurde nicht übereinstimmen (testType vs. test_type) so versucht nests als Objekt zur Karte . Aber enthält der Index eine verschachtelte Zuordnung bereits für Objekte unter dem Pfad nests, der den Fehler verursacht.

zu lösen, wir

var connectionPool = new Elasticsearch.Net.SniffingConnectionPool(poolUris); 
string testIndexName = "test"; 

var settings = new ConnectionSettings(connectionPool) 
    // specify test to be the default index, meaning if no index name 
    // is explicitly passed to a request or inferred from the type, 
    // this will be the default 
    .DefaultIndex(testIndexName); 

var client = new ElasticClient(settings); 

// create the index and add the mapping at the same time 
var createIndeReponse = client.CreateIndex(testIndexName, c => c 
    .Mappings(m => m 
     .Map<TestType>(mm => mm.AutoMap()) 
    ) 
); 

TestType testData = new TestType { Text = "Hello world", Id = "1" }; 
testData.Nests.Add(new NestedTestType { Value = "In the list", NotStoredValue = "Not stored" }); 

IIndexResponse iir = client.Index(testData); 

tun können, wenn Sie angeben möchten, dass TestType als Typname test_type abgebildet werden sollten, können Sie Ihre MapDefaultTypeNames auf Verbindungseinstellungen

var settings = new ConnectionSettings(connectionPool) 
    .DefaultIndex(testIndexName) 
    .MapDefaultTypeNames(d => d 
     .Add(typeof(TestType), "test_type") 
    ); 
Verwandte Themen