elasticsearch,C#,elasticsearch" /> elasticsearch,C#,elasticsearch" />

C# 在Elasticsearch中通过其父实体的值获取实体

C# 在Elasticsearch中通过其父实体的值获取实体,c#,elasticsearch,C#,elasticsearch,想象一下,我们在ES中有一个简单的实体 user { username: "ultrauser" name: "Greg" address: [ { city: "London" }, {city: "Prague" } ] } 我需要一个查询,它将返回用户ultrauser的所有地址 我使用的是NEST,现在,我选择user where username=ultrauser,然后自己只读地址字段。因此ES将返回整个用户实体,其中也包含地址 但ES是否可以像“给我所有地址”这样进行

想象一下,我们在ES中有一个简单的实体

user {
 username: "ultrauser"
 name: "Greg"
 address: [
  { city: "London" }, {city: "Prague" }
 ]
}
我需要一个查询,它将返回用户ultrauser的所有地址

我使用的是NEST,现在,我选择user where username=ultrauser,然后自己只读地址字段。因此ES将返回整个用户实体,其中也包含地址

但ES是否可以像“给我所有地址”这样进行查询,这属于用户“超级用户”

我需要ES返回包含地址的地址实体列表,而不是用户实体。从根到叶获取user.address.city很简单,但如何从叶到根轻松选择

重要的是,由于其他原因,我们不能使用父子或嵌套文档功能


感谢您的所有想法。

您可能应该阅读本文:您试图将RDBMS概念应用于elasticsearch,这通常是一个坏主意。事实上,即使您正在存储对象,它们仍然在elasticsearch的后台平放存储

如果我理解正确的话,我想这个问题会让你到达你想要的地方:

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "username": "some matched item"
                    }
                },
                {
                    "filtered": {
                        "filter": {
                            "exists": { "field" : "address" }
                        }
                    }
                }
            ]
        }
    },
    "fields": [
        "address"
    ]
}
如果您提取地址,或者您要求elasticsearch为您这样做,这有关系吗?有时,如果不需要,您不想通过网络发送所有数据,这可能是您的原因

这仍然会返回如下内容:

hits: [
{
_index: indexname
_type: typename
_id: id
_score: 1.4142135
fields: {
address: [
{someaddress_object}
]
}
}, ...

因此,当您返回结果时,仍然需要循环遍历结果,只是结果的大小更小。

是的,我需要它更小。我创建了这个简单的示例,因为用户包含更多的字段,当我只需要一个字段时,获取整个用户是没有意义的。我会尝试你的建议,让你知道并标出答案。但这可能需要一些时间,因为我使用的是泛型嵌套,所以我必须重写查询。谢谢你只有一个问题-为什么我要使用过滤器呢?如果我想要一个特定的地址,它属于用户ultrauser,那么我可以很容易地为用户进行查询,在字段地址上设置过滤器,然后说我只想要返回字段地址。但它将包含所有用户的地址,我必须用linq或其他东西再次应用过滤器。我只知道,想要的地址在结果的某个地方。@MartinPotvrzenejBrabec你真的不知道。我只是展示了一个稍微复杂一点的例子,如果你在寻找多个用户,你会想过滤掉那些没有地址的用户。或者,假设您正在查询一些其他值,比如显示某个城市的所有地址或其他什么。这个答案的重点是结尾的fields小节