2014-04-22 223 views
8

如何使用Elasticsearch Nest API重新创建以下索引?创建索引Nest

这里是包括映射索引中的JSON:

{ 
    "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" 
       } 
      } 
     } 
    } 
} 

这里是我的尝试:

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")) 
); 

的文件没有提到这事?

UPDATE:

研究发现,使用 var index = new IndexSettings()

this后,然后将分析字符串文字JSON。

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

一个在哪里可以找到更多像这样的例子,做这项工作?

+0

如果你不想处理lambda代码,答案在http://stackoverflow.com/questions/29026007/elasticsearch-nest-create-an-index-through-elasticclient-by-specifying-json/29068816#29068816描述如何将原始json传递给ElasticClient创建索引。在某些使用情况下,这可能更容易或更灵活。 – mcating

回答

10

有作为Nest Create Index Documentation概述,你可以做到这一点主要有两种方式:

在这里你直接申报索引设置,流利的字典条目的方式。就像你在上面的例子中所做的一样。我在本地测试了它,它产生了与上面的JSON匹配的索引设置。

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") 
      ) 
      ) 
     ) 
    ); 

请注意,NEST还包括使用强类型类创建索引设置的功能。如果我有时间完成它,我会在后面举一个例子。

希望这会有所帮助。

3

小例如:

  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

万一人有NEST 2.0时,.NumberOfReplicas(x)的.NumberOfShards(y)是在设置区域现在设置下兰巴表达内,从而指定。

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

NEST 2.0有很多变化,并且移动了一些东西,因此这些答案肯定是一个很好的起点。您可能需要为NEST 2.0更新进行一些调整。

+0

谢谢你 - 在文档中找不到它。当然,直到这个评论我真的不知道我在找什么。 :-) – hardba11

2

如果有人已经迁移到NEST 2.4,并且具有相同的问题 - 你需要定义在这样的指标设置您的自定义过滤器和分析器:

 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"))))));