美好的一天:
是否可以过滤掉不相关的嵌套对象?用例是您只有一个父级,但是父级有多个子级。例如,对于一个特定的父母来说……有100个孩子;我需要一种方法来过滤掉特定的孩子,以便在100个孩子中得到该结果的子集。
已更新
运行以下查询
GET /dev/doc/_search?typed_keys=true
{"_source":{"includes":["reviews"]},"query":{"nested":{"query":{"bool":{"filter":[{"term":{"reviews.userId":{"value":"339c8add-4278-4acd-905e-64b9acabc71a"}}}]}},"path":"reviews"}}}
但是,我得到了以下结果:
"reviews": [
{
"score": 0,
"friendlinessOfStaff": 1,
"amenities": 2,
"grounds": 2,
"reviewDate": "2018-07-03T02:00:34.8735726-07:00",
"qualityOfCare": 4,
"activities": 2,
"facilityReviewReplies": [],
"id": "56a4bac2-85d0-4ccf-aba2-fd9ff74fb3a5",
"message": "blah blah blah",
"userId": "339c8add-4278-4acd-905e-64b9acabc71a",
"cleanliness": 4
},
{
"score": 0,
"friendlinessOfStaff": 1,
"amenities": 2,
"grounds": 2,
"reviewDate": "2018-07-04T12:01:22.228658-07:00",
"qualityOfCare": 4,
"activities": 2,
"facilityReviewReplies": [],
"id": "f2f1b84e-bc1d-4e9c-b6d5-bdc578cb1b5f",
"message": "blah blah blah",
"userId": "7f1d389d-1316-4058-9857-ca51ecd9f5f8",
"cleanliness": 4
}
]
您可以看到此列表中的最后一个对象具有“ userId”:“ 7f1d389d-1316-4058-9857-ca51ecd9f5f8”与mot匹配,但是,过滤器仍在返回值。知道为什么会这样吗?
答案 0 :(得分:2)
听起来您在问如何过滤返回的内部嵌套对象。如果您询问如何选择要返回的列而不过滤那些列中的数据,Andreas的答案将有所帮助。
要仅返回与查询匹配的嵌套对象,可以使用inner_hits
。基本上只需将其添加到您的查询子句中,您就应该获得匹配的内部对象。您可以选择添加更多用于分页等的配置选项。
GET index/_search
{
"query": {
"nested": {
"path": "field_name",
"query": { ... },
"inner_hits": {}
}
}
}
答案 1 :(得分:0)
您正在使用什么客户端?
您可能想要这样的东西(java):https://stackoverflow.com/a/30476650/5335131
否则,这是:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html
您可以像这样指定要包括和排除的字段:
GET /_search
{
"_source": {
"includes": [ "obj1.*", "obj2.*" ],
"excludes": [ "*.description" ]
},
"query" : {
"term" : { "user" : "kimchy" }
}
}