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

时间:2014-01-21 12:12:58

标签: c# elasticsearch

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

user {
 username: "ultrauser"
 name: "Greg"
 address: [
  { city: "London" }, {city: "Prague" }
 ]
}

我需要一个查询,它会返回用户“ultrauser”的所有addreses。

我正在使用NEST,现在,我按照用户选择用户名=“ultrauser”的方式进行操作,然后自己只读取地址字段。因此ES将返回整个用户实体,其中也包含地址。

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

我需要ES返回包含地址的地址实体列表,而不是用户实体。从root到leafs(get user.address.city)很简单,但是如何从leafs中轻松选择root?

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

感谢您的所有想法。

1 个答案:

答案 0 :(得分:1)

您应该阅读本文:http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/您正在尝试将RDBMS概念应用于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}
]
}
}, ...

因此,当你取回它们时,你仍然需要遍历结果,只是结果大小更小。