我正在使用 Elasticsearch 7.15,需要聚合一個欄位并按順序對它們進行排序。
我保存在 Elasticsearch 中的檔案如下所示:
{
"logGroup" : "/aws/lambda/myLambda1",
...
},
{
"logGroup" : "/aws/lambda/myLambda2",
...
}
我需要找出哪個logGroup檔案最多。為了做到這一點,我嘗試aggregate在 Elasticsearch 中使用:
GET /my-index/_search?size=0
{
"aggs": {
"types_count": {
"terms": {
"field": "logGroup",
"size": 10000
}
}
}
}
此查詢的輸出如下所示:
"aggregations" : {
"types_count" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "aws",
"doc_count" : 26303620
},
{
"key" : "lambda",
"doc_count" : 25554470
},
{
"key" : "myLambda1",
"doc_count" : 25279201
}
...
}
正如您從上面的輸出中看到的那樣,它將logGroup值拆分為術語并根據術語而不是整個字串進行聚合。有沒有辦法讓我把它們聚合成一個完整的字串?
我希望輸出看起來像:
"buckets" : [
{
"key" : "/aws/lambda/myLambda1",
"doc_count" : 26303620
},
{
"key" : "/aws/lambda/myLambda2",
"doc_count" : 25554470
},
logGroup索引映射中的欄位為:
"logGroup" : {
"type" : "text",
"fielddata" : true
},
我可以在不更新索引的情況下實作它嗎?
uj5u.com熱心網友回復:
為了獲得您期望的結果,您需要將映射更改為:
"logGroup" : {
"type" : "keyword"
},
如果不這樣做,您的日志組將由標準分析器進行分析,該分析器會拆分整個字串,您將無法按完整日志組進行聚合。
如果您不想或不能更改映射并重新索引所有內容,您可以執行以下操作:
首先,keyword在映射中添加一個子欄位,如下所示:
PUT /my-index/_mapping
{
"properties": {
"logGroup" : {
"type" : "text",
"fields": {
"keyword": {
"type" : "keyword"
}
}
}
}
}
然后運行以下命令,以便所有現有檔案都選擇這個新欄位:
POST my-index/_update_by_query?wait_for_completion=false
最后,您將能夠通過以下查詢實作您想要的:
GET /my-index/_search
{
"size": 0,
"aggs": {
"types_count": {
"terms": {
"field": "logGroup.keyword",
"size": 10000
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408458.html
標籤:
