2017-01-19 6 views
2

Ich versuche, einen Index mit einem Kontext-Suggester mit Nest 5.0 auf ElasticSearch 5.1.2 zu erstellen.ElasticSearch 5.x Kontext Suggester NEST. NET

Derzeit kann ich das Mapping erstellen:

elasticClient.MapAsync<EO_CategoryAutocomplete>(m => m 
       .Properties(p => p 
        .Completion(c => c 
         .Contexts(ctx => ctx 
          .Category(csug => csug 
           .Name("lang") 
           .Path("l") 
          ) 
          .Category(csug => csug 
           .Name("type") 
           .Path("t") 
          ) 
          .Category(csug => csug 
           .Name("home") 
           .Path("h") 
          ) 
         ) 
         .Name(n => n.Suggest) 
        ) 
       ) 
      ); 

Aber in der POCO-Klasse ich weiß nicht, muss welche Objekttyp sein Vorschlagen Eigenschaft mit markiert ?????:

public class EO_CategoryAutocomplete 
{ 
    public string Id { get; set; } 
    public ????? Suggest { get; set; } 
} 

public class EO_CategoryAC 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

In NEST 5,0 CompletionField Property entfernt wurde

Bitte, jemand ein Beispiel darüber, wie es zu tun zur Verfügung stellen kann (dass das Verfahren Kontext suggester auf Elasticsearch 2.X zu tun war) ?

In der Dokumentation geht es um Abfragen. Suggester NEST

Danke.

Antwort

6

Der Completion und Context Suggester kann die _source in der Antwort in 5.x + zurückgeben, so dass keine Nutzlast mehr benötigt wird. Aus diesem Grund ist der Typ in NEST 5.x nun CompletionField, im Gegensatz zu CompletionField<TPayload> in NEST 2.x, wobei TPayload der Payload-Typ ist.

Hier ist ein Beispiel mit NEST 5.x Sie aufstehen und

public class EO_CategoryAutocomplete 
{ 
    public string Id { get; set; } 
    public IEnumerable<string> L { get; set; } 
    public CompletionField Suggest { get; set; } 
} 

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var connectionSettings = new ConnectionSettings(pool) 
      .DefaultIndex("autocomplete"); 

    var client = new ElasticClient(connectionSettings); 

    if (client.IndexExists("autocomplete").Exists) 
     client.DeleteIndex("autocomplete"); 

    client.CreateIndex("autocomplete", ci => ci 
     .Mappings(m => m 
      .Map<EO_CategoryAutocomplete>(mm => mm 
       .AutoMap() 
       .Properties(p => p 
        .Completion(c => c 
         .Contexts(ctx => ctx 
          .Category(csug => csug 
           .Name("lang") 
           .Path("l") 
          ) 
          .Category(csug => csug 
           .Name("type") 
           .Path("t") 
          ) 
          .Category(csug => csug 
           .Name("home") 
           .Path("h") 
          ) 
         ) 
         .Name(n => n.Suggest) 
        ) 
       ) 
      ) 
     ) 
    ); 

    client.IndexMany(new[] { 
     new EO_CategoryAutocomplete 
     { 
      Id = "1", 
      Suggest = new CompletionField 
      { 
       Input = new [] { "async", "await" }, 
       // explicitly pass a context for lang 
       Contexts = new Dictionary<string, IEnumerable<string>> 
       { 
        { "lang", new [] { "c#" } } 
       } 
      } 
     }, 
     new EO_CategoryAutocomplete 
     { 
      Id = "2", 
      Suggest = new CompletionField 
      { 
       Input = new [] { "async", "await" }, 
       // explicitly pass a context for lang 
       Contexts = new Dictionary<string, IEnumerable<string>> 
       { 
        { "lang", new [] { "javascript" } } 
       } 
      } 
     }, 
     new EO_CategoryAutocomplete 
     { 
      Id = "3", 
      // let completion field mapping extract lang from the path l 
      L = new [] { "typescript" }, 
      Suggest = new CompletionField 
      { 
       Input = new [] { "async", "await" }, 
      } 
     } 
    }, "autocomplete"); 

    client.Refresh("autocomplete"); 

    var searchResponse = client.Search<EO_CategoryAutocomplete>(s => s 
     .Suggest(su => su 
      .Completion("categories", cs => cs 
       .Field(f => f.Suggest) 
       .Prefix("as") 
       .Contexts(co => co 
        .Context("lang", 
         cd => cd.Context("c#"), 
         cd => cd.Context("typescript")) 
       ) 
      ) 
     ) 
    ); 

    // do something with suggestions 
    var categorySuggestions = searchResponse.Suggest["categories"]; 
} 

Die searchResponse kehrt

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 0, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "suggest" : { 
    "categories" : [ 
     { 
     "text" : "as", 
     "offset" : 0, 
     "length" : 2, 
     "options" : [ 
      { 
      "text" : "async", 
      "_index" : "autocomplete", 
      "_type" : "eo_categoryautocomplete", 
      "_id" : "3", 
      "_score" : 1.0, 
      "_source" : { 
       "id" : "3", 
       "l" : [ 
       "typescript" 
       ], 
       "suggest" : { 
       "input" : [ 
        "async", 
        "await" 
       ] 
       } 
      }, 
      "contexts" : { 
       "lang" : [ 
       "typescript" 
       ] 
      } 
      }, 
      { 
      "text" : "async", 
      "_index" : "autocomplete", 
      "_type" : "eo_categoryautocomplete", 
      "_id" : "1", 
      "_score" : 1.0, 
      "_source" : { 
       "id" : "1", 
       "suggest" : { 
       "input" : [ 
        "async", 
        "await" 
       ], 
       "contexts" : { 
        "lang" : [ 
        "c#" 
        ] 
       } 
       } 
      }, 
      "contexts" : { 
       "lang" : [ 
       "c#" 
       ] 
      } 
      } 
     ] 
     } 
    ] 
    } 
} 

was darauf hindeutet, Dokumente mit ids "1" und "3" läuft. Sie können auch Source Filtering verwenden, um nur die Felder zurückzugeben, an denen Sie interessiert sind, von _source.

+0

Danke ... Es funktioniert –

+0

keine Sorgen! Sie können es auch verbessern, wenn es geholfen hat :) –

Verwandte Themen