想象一下,我们在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?
重要的是,由于其他原因,我们无法使用父子或嵌套文档功能。
感谢您的所有想法。
答案 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}
]
}
}, ...
因此,当你取回它们时,你仍然需要遍历结果,只是结果大小更小。