【问题标题】:Creating an index Nest创建索引嵌套
【发布时间】:2014-06-06 21:41:05
【问题描述】:

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

这是包含映射的索引的 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"))
 );

文档没有提及这方面的任何内容?

更新:

找到this 使用的帖子 var index = new IndexSettings()

然后使用字符串文字 json 添加分析。

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

在哪里可以找到更多类似这样的示例,这是否有效?

【问题讨论】:

  • 如果您不想处理 lambda 代码,stackoverflow.com/questions/29026007/… 的答案描述了如何将原始 json 传递给 ElasticClient 以创建索引。在某些用例中,这可能更容易或更灵活。

标签: elasticsearch indexing nest elasticsearch-mapping elasticsearch-analyzers


【解决方案1】:

在旧版本中创建索引

Nest Create Index Documentation 中所述,您可以通过两种主要方式完成此操作:

这是直接将索引设置声明为 Fluent Dictionary 条目的方式。就像您在上面的示例中所做的那样。我在本地对此进行了测试,它会生成与上面的 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 还包括使用强类型类创建索引设置的能力。如果有时间,我稍后会发布一个示例。

使用 NEST 7.x 创建索引

还请注意,在 NEST 7.x 中,CreateIndex 方法已被删除。使用Indices.Create 不是。这是示例。

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

【讨论】:

    【解决方案2】:

    如果人们拥有 NEST 2.0,.NumberOfReplicas(x).NumberOfShards(y) 现在位于“设置”区域中,因此请在“设置”下的 Lamba 表达式中指定。

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

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

    【讨论】:

    • 谢谢,在文档中找不到这个。当然,在此评论之前,我并不真正知道我在寻找什么。 :-)
    【解决方案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
        );
    

    【讨论】:

      【解决方案4】:

      如果有人迁移到 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"))))));
      

      【讨论】:

        【解决方案5】:

        对于 7.X plus,您可以使用以下代码创建包含分片、副本和自动映射的索引:

         if (!_elasticClient.Indices.Exists(_elasticClientIndexName).Exists)
                {
                    var response = _elasticClient.Indices
                                    .Create(_elasticClientIndexName, s => s
                                        .Settings(se => se
                                            .NumberOfReplicas(1)
                                            .NumberOfShards(shards)
                                            ).Map<YourDTO>(
                                                        x => x.AutoMap().DateDetection(false)
                                                    ));
        
        
        
                    if (!response.IsValid)
                    {
                        // Elasticsearch index status is invalid, log an exception
        
                    }
                }
        

        【讨论】:

          猜你喜欢
          • 2012-04-01
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          相关资源
          最近更新 更多