是否有一種語法可以將嵌套檔案聚合到每個尊重嵌套過濾的主檔案?例如,在下面的示例中,我將如何找回擁有至少 2 年經驗的每支球隊的最年輕球員?我正在使用 Elasticsearch 7.10。
PUT sample
{
"mappings": {
"dynamic": "strict",
"properties": {
"teamId": { "type": "keyword", "index": true, "doc_values": true },
"members": {
"type": "nested",
"properties": {
"memberId": { "type": "keyword", "index": true, "doc_values": true },
"age": { "type": "integer", "index": true, "doc_values": true },
"experience": { "type": "integer", "index": true, "doc_values": true }
}
}
}
}
}
PUT sample/_doc/1
{
"teamId" : "A"
, "members" :
[
{ "memberId" : "A1" , "age" : "11" , "experience" : "1" }
, { "memberId" : "A2" , "age" : "21" , "experience" : "2" }
, { "memberId" : "A3" , "age" : "31" , "experience" : "3" }
]
}
PUT sample/_doc/2
{
"teamId" : "B"
, "members" :
[
{ "memberId" : "B1" , "age" : "12" , "experience" : "1" }
, { "memberId" : "B2" , "age" : "22" , "experience" : "2" }
, { "memberId" : "B3" , "age" : "32" , "experience" : "3" }
, { "memberId" : "B4" , "age" : "42" , "experience" : "4" }
]
}
PUT sample/_doc/3
{
"teamId" : "C"
, "members" :
[
{ "memberId" : "C1" , "age" : "13" , "experience" : "1" }
, { "memberId" : "C2" , "age" : "23" , "experience" : "2" }
, { "memberId" : "C3" , "age" : "33" , "experience" : "3" }
]
}
我可以在不過濾的情況下使其作業,如下所示:
POST sample/_search?filter_path=aggregations.teams.buckets.key,aggregations.teams.buckets.members.*.value,aggregations.teams.buckets.members.*.hits.hits._source.*
{
"aggs": {
"teams": {
"terms": {
"field": "teamId",
"size": 10
},
"aggs": {
"members": {
"nested": {
"path": "members"
} ,
"aggs": {
"min_age": { "min": { "field": "members.age" } }
, "max_age": { "max": { "field": "members.age" } }
}
}
}
}
}
}
但是當我添加如下所示的過濾時,我可以讓 inner_hits 正確過濾,但 aggs 不考慮它。有沒有辦法讓 aggs 考慮嵌套過濾器?
POST sample/_search?filter_path=aggregations.teams.buckets.key,aggregations.teams.buckets.members.*.value,aggregations.teams.buckets.members.*.hits.hits._source.*,hits.hits.inner_hits.members.hits.hits._source.*
{
"aggs": {
"teams": {
"terms": {
"field": "teamId",
"size": 10
},
"aggs": {
"members": {
"nested": {
"path": "members"
} ,
"aggs": {
"min_age": { "min": { "field": "members.age" } }
, "max_age": { "max": { "field": "members.age" } }
}
}
}
}
}
, "query": {
"bool": {
"filter": [
{ "nested": {
"path": "members",
"query": {
"bool": {
"must": [
{ "range": { "members.experience": { "gte": 3 } } }
]
}
}
, "inner_hits" : { "size" : 100 , "sort" : [ { "members.memberId" : { "order" : "asc" } } ] }
}
}
]
}
}
}
上面的輸出:
{
"hits" : {
"hits" : [
{
"inner_hits" : {
"members" : {
"hits" : {
"hits" : [
{
"_source" : {
"experience" : "3",
"age" : "33",
"memberId" : "C3"
}
}
]
}
}
}
},
{
"inner_hits" : {
"members" : {
"hits" : {
"hits" : [
{
"_source" : {
"experience" : "3",
"age" : "32",
"memberId" : "B3"
}
},
{
"_source" : {
"experience" : "4",
"age" : "42",
"memberId" : "B4"
}
}
]
}
}
}
},
{
"inner_hits" : {
"members" : {
"hits" : {
"hits" : [
{
"_source" : {
"experience" : "3",
"age" : "31",
"memberId" : "A3"
}
}
]
}
}
}
}
]
},
"aggregations" : {
"teams" : {
"buckets" : [
{
"key" : "A",
"members" : {
"max_age" : {
"value" : 31.0
},
"min_age" : {
"value" : 11.0
}
}
},
{
"key" : "B",
"members" : {
"max_age" : {
"value" : 42.0
},
"min_age" : {
"value" : 12.0
}
}
},
{
"key" : "C",
"members" : {
"max_age" : {
"value" : 33.0
},
"min_age" : {
"value" : 13.0
}
}
}
]
}
}
}
uj5u.com熱心網友回復:
當您在查詢中使用嵌套過濾器時,elasticsearch 會過濾主檔案并聚合它們,但它不會在聚合時過濾嵌套檔案。您應該將相同的過濾器添加到聚合中。此查詢應該適合您。
{
"aggs": {
"teams": {
"terms": {
"field": "teamId",
"size": 10
},
"aggs": {
"members": {
"nested": {
"path": "members"
},
"aggs": {
"filtered": {
"filter": {
"range": {
"members.experience": {
"gte": 3
}
}
},
"aggs": {
"min_age": {
"min": {
"field": "members.age"
}
},
"max_age": {
"max": {
"field": "members.age"
}
}
}
}
}
}
}
}
},
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "members",
"query": {
"bool": {
"must": [
{
"range": {
"members.experience": {
"gte": 3
}
}
}
]
}
},
"inner_hits": {
"size": 100,
"sort": [
{
"members.memberId": {
"order": "asc"
}
}
]
}
}
}
]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/453281.html
標籤:弹性搜索
