Creating an index Nest Creating an index Nest elasticsearch elasticsearch

Creating an index Nest


Creating an index in older versions

There are two main ways that you can accomplish this as outlined in the Nest Create Index Documentation:

Here is the way where you directly declare the index settings as Fluent Dictionary entries. Just like you are doing in your example above. I tested this locally and it produces the index settings that match your JSON above.

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

Please note that NEST also includes the ability to create index settings using strongly typed classes as well. I will post an example of that later, if I have time to work through it.

Creating index with NEST 7.x

Please also note that in NEST 7.x CreateIndex method is removed. Use Indices.Create isntead. Here's the example.

_client.Indices    .Create(indexName, s => s        .Settings(se => se            .NumberOfReplicas(replicas)            .NumberOfShards(shards)            .Setting("merge.policy.merge_factor", "10")));


In case people have NEST 2.0, the .NumberOfReplicas(x).NumberOfShards(y) are in the Settings area now so specify within the lamba expression under Settings.

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

NEST 2.0 has a lot of changes and moved things around a bit so these answers are a great starting point for sure. You may need to adjust a little for the NEST 2.0 update.


Small example :

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