使用 Elasticsearch 进行映射

Mapping with Elasticsearch

尝试从 ElasticSearch 读取某些字段时,我注意到如果我不包含文本属性,那么它不会将变量名映射到该字段。对于该特定字段,它将读取 null。假设我在 ES 中有一个名为 ValueId 的字段,类型为 text。在我的模型中 class 我有 public string ValueId {get; set;}ValueId 应该具有该变量的值,但是当我不添加 Elasticsearch 属性 属性时,即 [Text(Name = "ValueId")] 它 return 为空。

现在,如果我有如下内容,那么它将 return 该变量的值。

[Text(Name = "ValueId")]
public string ValueId {get; set;}

我的猜测是因为骆驼外壳,对吗?

另一方面,有没有一种方法可以动态设置 属性 名称(Name = "")?就像创建一个方法来执行此操作一样。

使用 NEST Automapping,它总能帮助我解决这些问题:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/auto-map.html

还有一点就是正确配置NEST的elastic,下面的例子展示了正确的配置方式:

public static void AddElasticsearch(this IServiceCollection services, IConfiguration configuration, bool configureDefaultQuery = true)
{
    var defaultIndex = configuration["ElasticsearchSettings:defaultIndex"];
    var basicAuthUser = configuration["ElasticsearchSettings:username"];
    var basicAuthPassword = configuration["ElasticsearchSettings:password"];

    var settings = new ConnectionSettings(new Uri(configuration["ElasticsearchSettings:uri"]));

    if (!string.IsNullOrEmpty(defaultIndex))
        settings = settings.DefaultIndex(defaultIndex);

    if (!string.IsNullOrEmpty(basicAuthUser) && !string.IsNullOrEmpty(basicAuthPassword))
        settings = settings.BasicAuthentication(basicAuthUser, basicAuthPassword);

    var client = new ElasticClient(settings);

    services.AddSingleton<IElasticClient>(client);
}

请继续使用 vindo nulo,使用配置进行实验:settings.DefaultFieldNameInferrer(p => p);

可以在这个示例项目中找到更多详细信息:https://github.com/hgmauri/elasticsearch-with-nest