c# - ElasticSearch.NET/NEST - 所有 result.Hit 字段均为空(但结果在那里)

标签 c# elasticsearch nest

我的问题是,当我调用 .Search(...) 时,它返回的结果为所有字段设置了所有空值(即使这些字段具有有效数据)。

MyClass 是:

    public class Member {
        public string ID { get; set; }

        public string ClientID { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string EmailAddress { get; set; }

        public string PasswordHash { get; set; }

        public string[] UserRoleIDs { get; set; }
    }

我这样构建 Elastic Client:

var node = new Uri("<correct url here>");
var config = new ConnectionSettings(node);
config.BasicAuthentication("elastic", "<correct password here>");
config.DisableDirectStreaming(true);

DB = new ElasticClient(config);

我这样查询 Elastic:

var res = DB.Search<Member>(s => s
    .Index("members")
    .Skip(0)
    .Take(10)
    .Query(q => q
        .Term(t => t.EmailAddress, emailAddress)
    )
);

我得到的结果是 200 OK,有 Hits 和 Documents,两者都具有我正在搜索的记录的正确 ID(查询按预期成功)。

我还可以将 res.ApiCall.ResponseBodyInBytes 评估为一个字符串,我可以看到 elastic 返回的 JSON 是正确的(字段有数据)。

但是 .. res.Document.FirstOrDefault() 返回一个“成员”类,其中所有字段均为 NULL(强调一下,JSON 中的字段值为空)。

我尝试将其更改为使用 Dictionary 而不是我的 Member 对象,这似乎工作正常(例如 myDictionary["FirstName"] == "Dan")。

此外,我尝试使用搜索结果给我的 ID 并调用:

    var user = DB.Get<Member>(id, i => i.Index("members"));

这具有相同的最终结果,user.Hit 的所有字段均为 null :(

最佳答案

问题似乎出在属性的大小写上。当我刚开始使用 ES 和 .Net 时,我也遇到了同样的问题。如果您已通过 C# Nest 代码对其进行索引,则您的类成员的属性将已从 PascalCase 转换为 camelCase,并将作为 camelCase 进行索引。由于在 ES 中默认,字段/属性应该是驼峰式的。

如果您没有通过 C# Nest 客户端和 PostMan 或其他 API 客户端进行索引,并且如果 JSON 中出现的属性具有 PascalCase,那么它们将不会映射到您的对象,原因与上述相同。

如果您使用 PostMan 或类似的东西进行索引,请尝试将 ES 文档中的属性从 PascalCase 更改为 camelCase。

否则尝试通过 C# Nest Client 建立索引。这是一个通过 C# Nest 客户端建立索引的示例(如果您使用的是 Nest v7.x)并且如果有多个文档要建立索引:

Member[] members = new Member[10];

//some code to add Member class objects to members array.

var bulkIndexResponse =  DB.BulkAsync(b => b.("members").IndexMany(members));

关于c# - ElasticSearch.NET/NEST - 所有 result.Hit 字段均为空(但结果在那里),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58175271/

相关文章:

c#-4.0 - Elastic Search-使用C#搜索其中包含空格和特殊字符的字符串

c# - 如何使用特定属性搜索对象列表

c# - 在遗留 .NET 平台上使用 .NET Core 包

elasticsearch - ElasticSearch忽略只有一个字母的单词

laravel - 如何将流明日志发送到 ELK

elasticsearch - 定义查询表达式后,是否可以引用并过滤查询表达式中的脚本字段?

c# - ElasticSearch 结合 Terms 和 Match 查询

C# 字符串 float ?

c# - JSON.Net 获取原生类型的值

c# - 从 POST 上不成功的低级别调用构建的无效 NEST 响应