2014-04-22 19 views
8

Jak odtworzyć poniższy indeks przy użyciu Elasticsearch Nest API?Tworzenie indeksu Nest

Oto json dla indeksu wraz z mapowaniem:

{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "trigrams_filter": { 
        "type":  "ngram", 
        "min_gram": 3, 
        "max_gram": 3 
       } 
      }, 
      "analyzer": { 
       "trigrams": { 
        "type":  "custom", 
        "tokenizer": "standard", 
        "filter": [ 
         "lowercase", 
         "trigrams_filter" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "data": { 
     "_all" : {"enabled" : true}, 
      "properties": { 
       "text": { 
        "type":  "string", 
        "analyzer": "trigrams" 
       } 
      } 
     } 
    } 
} 

Oto moja próba:

var newIndex = client.CreateIndexAsync(indexName, index => index 
      .NumberOfReplicas(replicas) 
      .NumberOfShards(shards) 
      .Settings(settings => settings 
       .Add("merge.policy.merge_factor", "10") 
       .Add("search.slowlog.threshold.fetch.warn", "1s") 
       .Add("mapping.allow_type_wrapper", true)) 
      .AddMapping<Object>(mapping => mapping 
       .IndexAnalyzer("trigram") 
       .Type("string")) 
); 

Dokumentacja nie wspomina nic o tym?

UPDATE:

Znaleziony this słupek, który używa var index = new IndexSettings()

a następnie dodaje Analysis ze strun dosłownym JSON.

index.Add("analysis", @"{json});

Gdzie można znaleźć więcej przykładów takich jak ten i to działa?

+0

Jeśli nie chcemy mieć do czynienia z kod lambda, odpowiedź na http://stackoverflow.com/questions/29026007/elasticsearch-nest-create-an-index-through-elasticclient-by-specifying-json/29068816#29068816 opisuje, jak przekazać surowy json do ElasticClient utworzyć indeks. W niektórych przypadkach może to być łatwiejsze lub bardziej elastyczne. – mcating

Odpowiedz

10

Istnieją dwa główne sposoby, że można tego dokonać zgodnie z opisem w Nest Create Index Documentation:

Oto sposób, w którym bezpośrednio deklarują ustawienia indeksu jak wpisy Zaawansowany słownik. Tak jak w powyższym przykładzie. Przetestowałem to lokalnie i tworzy on ustawienia indeksu, które pasują do twojego JSON powyżej.

var response = client.CreateIndex(indexName, s => s 
     .NumberOfReplicas(replicas) 
     .NumberOfShards(shards) 
     .Settings(settings => settings 
     .Add("merge.policy.merge_factor", "10") 
     .Add("search.slowlog.threshold.fetch.warn", "1s") 
     .Add("mapping.allow_type_wrapper", true) 
     .Add("analysis.filter.trigrams_filter.type", "nGram") 
     .Add("analysis.filter.trigrams_filter.min_gram", "3") 
     .Add("analysis.filter.trigrams_filter.max_gram", "3") 
     .Add("analysis.analyzer.trigrams.type", "custom") 
     .Add("analysis.analyzer.trigrams.tokenizer", "standard") 
     .Add("analysis.analyzer.trigrams.filter.0", "lowercase") 
     .Add("analysis.analyzer.trigrams.filter.1", "trigrams_filter") 
     ) 
     .AddMapping<Object>(mapping => mapping 
      .Type("data") 
      .AllField(af => af.Enabled()) 
      .Properties(prop => prop 
      .String(sprop => sprop 
       .Name("text") 
       .IndexAnalyzer("trigrams") 
      ) 
      ) 
     ) 
    ); 

Należy pamiętać, że NEST obejmuje również możliwość tworzenia ustawień indeksów przy użyciu klas silnie napisanych. Później podam ten przykład, jeśli będę miał czas, aby przez to przejść.

Mam nadzieję, że to pomoże.

3

Mały przykład:

  EsClient.CreateIndex("indexname", c => c 
       .NumberOfReplicas(replicasNr) 
       .NumberOfShards(shardsNr) 
      .Settings(s => s 
       .Add("merge.policy.merge_factor", "10") 
       .Add("search.slowlog.threshold.fetch.warn", "15s") 
      ) 

      #region Analysis 
      .Analysis(descriptor => descriptor 
       .Analyzers(bases => bases 
        .Add("folded_word", new CustomAnalyzer() 
        { 
         Filter = new List<string> { "icu_folding", "trim" }, 
         Tokenizer = "standard" 
        } 
        ) 

      .TokenFilters(i => i 
         .Add("engram", new EdgeNGramTokenFilter 
         { 
          MinGram = 1, 
          MaxGram = 20 
         } 
         ) 
      ) 
      .CharFilters(cf => cf 
         .Add("drop_chars", new PatternReplaceCharFilter 
         { 
          Pattern = @"[^0-9]", 
          Replacement = "" 
         } 

      ) 
      #endregion 

      #region Mapping Categories 
      .AddMapping<Categories>(m => m 
       .Properties(props => props 
        .MultiField(mf => mf 
          .Name(n => n.Label_en) 
          .Fields(fs => fs 
           .String(s => s.Name(t => t.Label_en).Analyzer("folded_word")) 
           ) 
         ) 
      ) 
      #endregion 
    ); 
9

W przypadku osób ma NEST 2.0, .NumberOfReplicas (x) .NumberOfShards (Y) są w obszarze Ustawienia teraz więc określić w wyrażeniu Lamba w Ustawieniach.

 EsClient.CreateIndex("indexname", c => c 
     .Settings(s => s 
      .NumberOfReplicas(replicasNr) 
      .NumberOfShards(shardsNr) 
     ) 

NEST 2.0 ma wiele zmian i trochę się porusza, więc te odpowiedzi są świetnym punktem wyjścia na pewno. Być może będziesz musiał nieco zmienić aktualizację NEST 2.0.

+0

Dzięki człowieku - nie można znaleźć tego w dokumentach. Oczywiście do tego komentarza nie wiedziałem dokładnie, czego dokładnie szukałem. :-) – hardba11

2

W przypadku ktoś przeniesione do NEST 2.4 i ma to samo pytanie - trzeba by zdefiniować swoje własne filtry i analizatory w ustawieniach takich jak ten indeks:

 elasticClient.CreateIndex(_indexName, i => i 
      .Settings(s => s 
       .Analysis(a => a 
        .TokenFilters(tf => tf 
         .EdgeNGram("edge_ngrams", e => e 
          .MinGram(1) 
          .MaxGram(50) 
          .Side(EdgeNGramSide.Front))) 
         .Analyzers(analyzer => analyzer 
          .Custom("partial_text", ca => ca 
           .Filters(new string[] { "lowercase", "edge_ngrams" }) 
           .Tokenizer("standard")) 
          .Custom("full_text", ca => ca 
           .Filters(new string[] { "standard", "lowercase" }) 
           .Tokenizer("standard")))))); 
Powiązane problemy