2017-08-30 133 views
0

返回一條記錄每個產品在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 
     } 
    ], 

回答

0

你有錯誤的原因是因爲你試試在基於文本字段(product.name)聚集你不能這樣做,在elasticsearch 5 你並不需要設置字段數據爲真,你需要做的映射定義字段的產品是什麼。名稱作爲2場,一個product.name和第二product.name.keyword 像這樣:

{ 
"product.name": 
     { 
     "type" "text", 
      "fields": 
      { 
       "keyword": 
        { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
      } 
     } 
    } 

然後,你需要做的聚集上product.name.keyword

+0

鬆懈,我剛剛逸岸在發佈這個問題之後,我在上面的查詢中把「field」:「product.name」替換爲「field」:「product.name.keyword」,並且至少沒有失敗並且似乎返回正確的記錄。我們是否真的需要使用上面的大部分,而不是用product.name.keywrod替換product.name?如果是,爲什麼?以及我如何在我上面的當前查詢中包含這些內容? – user1892775

+0

整個大部分都需要放在您的架構中。請張貼您的架構 – Lax