c# nest elastic generic index 创建

c# nest elastic generic index create

我有一个通用的“创建”方法。此方法将按通用类型创建索引。

public void Create<T>(T node) 
{        
    if (!_elasticClient.IndexExists(_indexName).Exists)
    {
        var indexSettings = new IndexSettings();
        indexSettings.NumberOfReplicas = 1;
        indexSettings.NumberOfShards = 3;

        var createIndexDescriptor = new CreateIndexDescriptor(_indexName)
                .Mappings(ms => ms.Map<T>(m => m.AutoMap()))
                .InitializeUsing(new IndexState() { Settings = indexSettings })
                .Aliases(a => a.Alias(aliasName));

        var response = _elasticClient.CreateIndex(createIndexDescriptor);
    }

    _elasticClient.Index<T>(node, idx => idx.Index(_indexName));
}

但我收到错误:

  1. 类型'T'必须是引用类型才能在泛型类型或方法中用作参数'T' 'MappingsDescriptor.Map(Func)'

  2. 类型'T'必须是引用类型才能在泛型类型或方法中用作参数'T' 'ElasticClient.Index(T, Func)'

尝试添加where T : class:

public void Create<T>(T node) where T : class
    {        
        if (!_elasticClient.IndexExists(_indexName).Exists)
        {
            var indexSettings = new IndexSettings();
            indexSettings.NumberOfReplicas = 1;
            indexSettings.NumberOfShards = 3;

            var createIndexDescriptor = new CreateIndexDescriptor(_indexName)
           .Mappings(ms => ms
                           .Map<T>(m => m.AutoMap())
                    )
            .InitializeUsing(new IndexState() { Settings = indexSettings })
            .Aliases(a => a.Alias(aliasName));

            var response = _elasticClient.CreateIndex(createIndexDescriptor);
        }

        _elasticClient.Index<T>(node, idx => idx.Index(_indexName));
    }
}

我解决了我遇到的问题,请参阅下文。

nest 中的 .Map<T>() 方法对 T 使用 class 约束。您需要向通用 T.

添加相同的 class 约束
public void Create<T>(T node)
    where T: class
{
    // your code here
}