考慮以下一組檔案:
{transaction: "A", date: "1999-10-27" }
{transaction: "B", date: "1999-10-26" }
{transaction: "C", date: "1999-10-26" }
{transaction: "A", date: "1999-10-27" }
{transaction: "A", date: "1999-12-25" }
{transaction: "B", date: "2000-10-25" }
我正在嘗試添加一個過濾器,它只會transaction根據欄位的值選擇每個檔案的最后一個檔案date并獲取以下檔案:
{transaction: "C", date: "1999-10-26" }
{transaction: "A", date: "1999-12-25" }
{transaction: "B", date: "2000-10-25" }
此外,術語聚合不起作用,因為我還需要對結果檔案進行直方圖聚合(按年份)
{
1999: 2
}, {
2000: 1
}
uj5u.com熱心網友回復:
有兩種方法可以實作您所需要的。
A. 使用折疊功能
GET test/_search
{
"_source": false,
"query": {
"match_all": {}
},
"collapse": {
"field": "transaction",
"inner_hits": [
{
"name": "latest",
"size": 1,
"sort": [
{
"date": {
"order": "desc"
}
}
]
}
]
}
}
B. 對欄位使用terms聚合 對最新交易進行排序transactiontop_hitsdate
GET test/_search
{
"query": {
"match_all": {}
},
"aggs": {
"transactions": {
"terms": {
"field": "transaction"
},
"aggs": {
"latest": {
"top_hits": {
"size": 1,
"sort": [
{
"date": {
"order": "desc"
}
}
]
}
}
}
}
}
}
使用上述查詢,在您的應用程式邏輯中計算出日期直方圖就很簡單了。
更新:
如果您真的希望 ES 為您構建該日期直方圖,您可以通過利用scripted_metric聚合并自己構建聚合邏輯來實作這一點。請注意,此解決方案使用腳本,它可能會根據資料量影響集群的性能。
POST test/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"years": {
"scripted_metric": {
"init_script": "state.latest = [:]",
"map_script": """
// 1. record the latest year for each transaction
def key = doc['transaction.keyword'].value;
if (!state.latest.containsKey(key)) {
state.latest[key] = 0;
}
def year = doc['date'].value.getYear();
if (state.latest[key] < year) {
state.latest[key] = year;
}
""",
"combine_script": """
return state.latest
""",
"reduce_script": """
// 2. count how many documents per "latest" year
def years = [:];
states.stream().forEach(shardState -> {
shardState.keySet().stream().forEach(transaction -> {
def year = shardState[transaction].toString();
if (!years.containsKey(year)) {
years[year] = 0;
}
years[year] ;
});
});
return years;
"""
}
}
}
}
例如,上面的聚合查詢將起作用并回傳以下內容,這幾乎是您所期望的:
"aggregations" : {
"years" : {
"value" : {
"2000" : 1,
"1999" : 2
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444288.html
標籤:弹性搜索
上一篇:無法理解彈性搜索分析器正則運算式
