elasticsearch 创建索引嵌套

wqlqzqxt  于 2023-01-16  发布在  ElasticSearch
关注(0)|答案(5)|浏览(255)

如何使用Elasticsearch Nest API重新创建以下索引?
下面是包含Map的索引的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"))
 );

文档中没有提到这方面的任何内容吗?
更新:
找到使用var index = new IndexSettings()this帖子
然后添加带有字符串文字json的Analysis。
index.Add("analysis", @"{json});
在哪里可以找到更多像这样的例子,这是否有效?

hivapdat

hivapdat1#

在旧版本中创建索引

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

lymnna712#

如果用户使用的是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更新做一些调整。

h7wcgrx3

h7wcgrx33#

小例子:

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

x33g5p2x4#

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

pu3pd22g5#

对于7.X plus,您可以使用以下代码通过Shards、Replicas和Automapping创建索引:

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

            }
        }

相关问题