【问题标题】:Fields search does not return field values字段搜索不返回字段值
【发布时间】:2015-05-03 22:32:57
【问题描述】:

我正在尝试使用 NEST 客户端在索引中仅选择具有 >100 个字段的搜索中的特定字段。 搜索按预期返回 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);

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

更新:在没有字段过滤器的情况下进行搜索并遍历 hits fields 属性时也为空。

【问题讨论】:

  • 可以分享地图吗?
  • [ElasticType(IdProperty = "AccountNumber")] 公共类 Customer {

标签: elasticsearch nest


【解决方案1】:

如下更改您的搜索:

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 的 camelCase 属性,所以当您检查您的映射时,您会看到如下内容:

{
    "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")));
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2011-12-14
    • 2019-09-26
    相关资源
    最近更新 更多