ElasticSearch.NET / NEST-所有结果。命中字段为空(但结果在那里)

问题描述 投票:0回答:1

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

c# elasticsearch nest
1个回答
1
投票

问题似乎在于属性。当我刚接触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));
© www.soinside.com 2019 - 2024. All rights reserved.