返回一條記錄每個產品在Kibana,我可以爲各種產品(product.name)與時間戳和其他信息一起查看日誌。以下是日誌之一:ELK查詢與最大時間戳
{
"_index": "xxx-2017.08.30",
"_type": "logs",
"_id": "xxxx",
"_version": 1,
"_score": null,
"_source": {
"v": "1.0",
"level": "INFO",
"timestamp": "2017-01-30T18:31:50.761Z",
"product": {
"name": "zzz",
"version": "2.1.0-111"
},
"context": {
...
...
}
},
"fields": {
"timestamp": [
1504117910761
]
},
"sort": [
1504117910761
]
}
還有幾個其他日誌用於同一產品,還有幾個不同產品的日誌。
不過,我想寫,對於給定product.name(具有最大時間戳值)返回單個記錄查詢並返回所有其他產品相同的信息。那就是每個產品和每個產品都有一個日誌返回,它應該是具有最大時間戳的日誌。
我該如何做到這一點?
我試圖按照中列出的方法: How to get latest values for each group with an Elasticsearch query?
並創建一個查詢:
{
"aggs": {
"group": {
"terms": {
"field": "product.name"
},
"aggs": {
"group_docs": {
"top_hits": {
"size": 1,
"sort": [
{
"timestamp": {
"order": "desc"
}
}
]
}
}
}
}
}
}'
但是,我得到一個錯誤,說:
"error" : {
"root_cause" : [
{
"type" : "illegal_argument_exception",
"reason" : "Fielddata is disabled on text fields by default. Set fielddata=true on [product.name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
],
難道我絕對在這種情況下需要爲此字段設置fielddata = true?如果不是,我該怎麼辦?如果是,我不知道如何設置它。我試圖做這樣說:
curl -XGET 'localhost:9200/xxx*/_search?pretty' -H 'Content-Type: application/json' -d'
{
"properties": {
"product.name": {
"type": "text",
"fielddata": true
}
},
"aggs": {
"group": {
"terms": {
"field": "product.name"
},
"aggs": {
"group_docs": {
"top_hits": {
"size": 1,
"sort": [
{
"timestamp": {
"order": "desc"
}
}
]
}
}
}
}
}
}'
不過,我覺得有什麼不妥之處,我得到這個錯誤(synatactically?):
{
"error" : {
"root_cause" : [
{
"type" : "parsing_exception",
"reason" : "Unknown key for a START_OBJECT in [properties].",
"line" : 3,
"col" : 19
}
],
鬆懈,我剛剛逸岸在發佈這個問題之後,我在上面的查詢中把「field」:「product.name」替換爲「field」:「product.name.keyword」,並且至少沒有失敗並且似乎返回正確的記錄。我們是否真的需要使用上面的大部分,而不是用product.name.keywrod替換product.name?如果是,爲什麼?以及我如何在我上面的當前查詢中包含這些內容? – user1892775
整個大部分都需要放在您的架構中。請張貼您的架構 – Lax