2016-03-30 3 views
1

In einer älteren Version von Nest konnte ich dies tun:Nest CopyTo, Tokenizer und Analyzer in 2.x

var newIndexRequest = client.CreateIndex(ci => ci.Index(IndexName.ToLower()) 
    .Analysis(a => a 
     .Analyzers(an => an 
      .Add("search_ngram_analyzer", customAnalyzer)) 
     .Tokenizers(t => t 
      .Add("search_ngram_tokenizer", new NGramTokenizer 
      { 
       MaxGram = 500, // qty of chars to separate into tokens 
       MinGram = 2 
      }))) 
    .AddMapping<Models.CustomerSearchResult>(m => m 

     .MapFromAttributes() 
      .Properties(p => p 
       .String(s => s.Name("short_name").CopyTo("search").Index(FieldIndexOption.NotAnalyzed)) 
       .String(s => s.Name("legacy_name").CopyTo("search").Index(FieldIndexOption.NotAnalyzed)) 
       .String(s => s.Name("legacy_contact_name").CopyTo("search").Index(FieldIndexOption.NotAnalyzed)) 
       .String(s => s.Name("search").Index(FieldIndexOption.Analyzed).Analyzer("search_ngram_analyzer")) 
       ) 
      )); 

Da die Dokumentation nicht aktualisiert wurde (oder ich habe nicht in der Lage gewesen, finde es), ich kann nicht herausfinden, wie man dasselbe in Nest 2.x macht.)

.. Ich weiß, ich brauche AutoMap anstelle von MapFromAttributes, aber ich weiß nicht, wie man das richtig einstellt Analyzer, Tokenizer und CopyTo funktionieren.

Das ist alles, was ich bisher habe:

 var customerSearchIdxDesc = new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName) 
      .Mappings(ms => ms.Map<SO.Services.Data.ServiceModel.DtoTypes.Customer.SearchResult>(m => m.AutoMap())); 
     var response = client.CreateIndex(customerSearchIdxDesc); 

aktualisieren

immer näher Ich denke:/

var customerSearchIdxDesc = new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName) 
    .Settings((f) => 
    { 
     return f.Analysis(analysis => analysis 
      .Analyzers(analyzers => analyzers 
       .Custom("search_ngram_analyzer", a => a 
        .Filters("lowercase") 
        .Tokenizer("search_ngram_tokenizer"))) 
      .Tokenizers(tokenizers => tokenizers 
        .NGram("search_ngram_tokenizer", t => t 
         .MinGram(2) 
         .MaxGram(500) 
         .TokenChars(TokenChar.Digit, TokenChar.Letter, TokenChar.Punctuation, TokenChar.Punctuation, TokenChar.Symbol)))); 
    }) 
    .Mappings(ms => ms.Map<SO.Services.Data.ServiceModel.DtoTypes.Customer.SearchResult>(m => m.AutoMap())); 
+0

DOKUMENTAT Ionen für 2.x finden Sie unter https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/index.html, mit automatischen Dokumenten unter https://www.elastic.co /guide/enlassearch/client/net-api/2.x/auto-map.html. Einige Dokumente auf Analysatoren wären eine großartige Ergänzung :) –

Antwort

1

Dies ist meine Lösung

var customerSearchIdxDesc = new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName) 
    .Settings(f => 
     f.Analysis(analysis => analysis 
       .Analyzers(analyzers => analyzers 
        .Custom(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram, a => a 
         .Filters("lowercase") 
         .Tokenizer(Constants.ElasticSearch.TokenizerNames.NoWhitespaceNGram))) 
       .Tokenizers(tokenizers => tokenizers 
         .NGram(Constants.ElasticSearch.TokenizerNames.NoWhitespaceNGram, t => t 
          .MinGram(2) 
          .MaxGram(500) 
          .TokenChars(TokenChar.Digit, TokenChar.Letter, TokenChar.Punctuation, TokenChar.Punctuation, TokenChar.Symbol) 
         ) 
       ) 
     ) 
    ) 
    .Mappings(ms => ms.Map<ServiceModel.DtoTypes.Customer.SearchResult>(m => m 
     .AutoMap() 
     .Properties(p => p 
      .String(n => n.Name(c => c.CustomerName).CopyTo(f => 
       { 
        return new FieldsDescriptor<string>().Field("search"); 
       }).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(c => c.ContactName).CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName)).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(c => c.City).CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName)).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(c => c.StateAbbreviation).CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName)).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(c => c.Country).CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName)).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(c => c.PostalCode).CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName)).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      .String(n => n.Name(Constants.ElasticSearch.CombinedSearchFieldName).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram)) 
      ) 
     ) 
    ); 

var response = client.CreateIndex(customerSearchIdxDesc);