字段搜索不 return 字段值

Fields search does not return field values

我正在尝试 select 使用 NEST 客户端在超过 100 个字段的索引中仅搜索特定字段。 搜索 returns 10K 结果符合预期,但在循环时命中字段值字典为空(我在调试器中看到它)。 下面是代码:

var elastic = new ElasticClient(new ConnectionSettings(defaultIndex: "customer"));

var result = elastic.Search<Customer>(s => s.Fields(new[] { "AccountNumber", "Folder" })
            .From(0).Size(10000).SortDescending(c => c.DateAdded)
            .Query(q => q.Term(c => c.Language, "english")));

    foreach (var res in result.Hits)
    {
        Console.WriteLine(res.Fields.FieldValues<Customer, int>(c => c.AccountNumber).First() +
            " " + res.Fields.FieldValues<Customer, int>(c => c.Folder).First());
    }

    Console.WriteLine("Query Elapsed MS: {0}", result.ElapsedMilliseconds);

在没有字段过滤器的情况下进行相同的搜索并遍历文档可以正常工作。

更新:在没有字段过滤器的情况下搜索并迭代命中字段时 属性 也为空。

如下更改您的搜索:

elastic.Search<Customer>(s => s.Fields(new[] { "accountNumber", "folder" })
            .From(0).Size(10000).SortDescending(c => c.DateAdded)
            .Query(q => q.Term(c => c.Language, "english")));

为什么有效?因为 NEST 默认使用驼峰命名法,所以当您检查映射时,您会看到类似以下内容:

{
    "indexname" : {
        "mappings" : {
            "document" : {
                "properties" : {
                    "accountNumber" : {
                        "type" : "string"
                    },
                    "folder" : {
                        "type" : "string"
                    },
                    "id" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

如您所见,没有像 AccountNumber 或 Folder 这样的字段。

要处理它,你可以:

  1. 设置 属性 名称不变

    settings.SetDefaultPropertyNameInferrer(p=>p);
    
  2. 更改搜索:

    var result = elastic.Search<Customer>(s => s.Fields(f => f.AccountNumber, f => f.Folder))
                .From(0).Size(10000).SortDescending(c => c.DateAdded)
                .Query(q => q.Term(c => c.Language, "english")));