我的问题是,当我调用 .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/