我的问题是,当我调用.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评估为字符串,并且我可以看到弹性返回的JSON是正确的(字段具有数据)。
[BUT .. res.Document.FirstOrDefault()返回一个“ Member”类,其中所有字段均为NULL(要强调的是,JSON的字段值为null)。
我尝试将其更改为使用Dictionary而不是Member对象,并且似乎可以正常工作(例如,myDictionary [“ FirstName”] ==“ Dan”)。
而且,我尝试使用搜索结果给我的ID并打电话:
var user = DB.Get<Member>(id, i => i.Index("members"));
这具有相同的最终结果,用户的所有字段都为null:(
问题似乎在于属性。当我刚接触ES和.Net时,我也遇到了同样的问题。如果已通过C#嵌套代码对其进行索引,则您的类成员的属性将从PascalCase转换为camelCase,并被索引为camelCase。由于在ES中使用了defalut,因此应将字段/属性驼峰化。
如果您没有通过C#Nest客户端以及PostMan或其他API客户端建立索引,并且JSON中显示的属性具有PascalCase,则由于上述相同的原因,它们将不会映射到您的Object。
如果您使用PostMan或类似的东西进行索引,请尝试将ES文档中的属性从PascalCase更改为camelCase。
否则,请尝试通过C#Nest Client进行索引。这是通过C#Nest Client(如果您使用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));