【问题标题】:Elasticsearch NEST query nested objectElasticsearch NEST 查询嵌套对象
【发布时间】:2020-04-26 01:09:49
【问题描述】:

我想从名为“userprofiles”的索引中的文档中检索嵌套对象。

我的 UserProfile 模型:

公共类 UserProfileModel

{
    public string FullName { get; set; }
    public string Oid { get; set; }
    public string Upn { get; set; }
    public List<SsoLink> FavoriteSsoLinks { get; set; } = new List<SsoLink>();
}

我的 SsoLink 模型:

public class SsoLink
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public string Owner { get; set; }
}

索引创建:

PUT userprofiles
{
    "mappings" : {
        "properties" : {
            "FavoriteSsoLinks" : {
                "type" : "object"
            }
        }
    }
}

我的查询:

var searchResponse = _client.Search<UserProfileModel>(s => s
                .Index(_profileIndex)
                .Query(q=>q
                    .Term(t => t.Field(t => t.Oid).Value(oid)
                        )
                    )
                );

现在它返回文档,但是 favoritelinks 对象是空白的,但是我看到 Kibana 列出的对象。我一定遗漏了一些明显的东西,但很难弄清楚这一点。

这是我的数据示例:

【问题讨论】:

  • 查询似乎是正确的。你能从你的索引中添加一个示例文档吗
  • 查询没问题,我试过了。可能是您正在搜索 oid 的文档可能没有 favoriteSsoLinks 值。您应该运行 { "query": { "term": { "oid": { "value": "VALUE" } } } } 并在 kibana 开发工具中检查值
  • 有趣的是,我正在尝试查找 oid = "someOID" 的所有 favoriteSsoLinks。您是如何制作索引的?
  • 我刚刚创建了一个包含对象类型和文本字段的示例示例文档,并且我返回的模型具有对象字段。在您的情况下,您可以在 kibana 开发工具中运行查询以确保“favoriteSsoLinks”具有值(可能为空),或者如果您正在使用源过滤,那么您将提及此字段
  • 好的,所以当我使用开发工具搜索时 GET userprofiles/_search { "query": { "term": { "_id": { "value": "1-123-1234-1232- 41234-12341" } } } } 我可以看到响应,但在我的代码中我没有让他们返回 favoriteSsoLinks...

标签: c# elasticsearch nest elasticsearch-query


【解决方案1】:

索引创建示例使用"FavoriteSsoLinks" 作为属性,但Kibana 屏幕截图使用"favoriteSsoLinks" 以小写f 开头 - 这是正确的吗?我怀疑属性大小写可能是问题所在,但需要查看索引中的映射才能知道这是否正确。

7.x 客户端对 JSON 中的属性名大小写有严格要求,默认情况下使用驼峰式属性名来匹配 POCO 属性名。例如,默认情况下

  • JSON 中的"favoriteSsoLinks"匹配FavoriteSsoLinks POCO 属性
  • JSON 中的"FavoriteSsoLinks"不匹配FavoriteSsoLinks POCO 属性

可以使用ConnectionSettings 上的DefaultFieldNameInferrer(Func&lt;string, string&gt;) 更改所有属性的此行为,或者使用属性上的属性(例如DataMemberAttributePropertyNameAttribute)逐个属性地更改此行为,或者使用DefaultMappingFor&lt;T&gt; 其中T是 POCO 类型。

【讨论】:

    猜你喜欢
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2015-05-31
    • 2015-01-13
    相关资源
    最近更新 更多