2015-08-18 39 views
1

我在重建的sqlite3數據庫爲一體的elasticsearch ..「排序」 Elasticsearch

在Python腳本我有,是由國家訂購的sqlite3數據庫像這樣的線路,

`rows = cur.execute("""SELECT * FROM {tn} ORDER BY (CASE state when 'CRITICAL' THEN 1 WHEN 'WARNING' then 2 WHEN 'UNKNOWN' THEN 3 ELSE 100 END) ASC;""".format(tn=table_name))` 

我想知道是否有辦法,如果是的話,如何使用elasticsearch-python客戶端複製這個「ORDER BY CASE」?

使用elasticsearch_dsl搜索對象,我有這個迄今爲止...

##Query for ID ## 
    s = Search(using=client, index="logstash-*",)\ 
    .query("match", host="{h}".format(h=host_name)) 

    ## Sort by State ## 
    s = s.sort("state", {"order" : "CRITICAL", "WARNING", "UNKNOWN"}) 

謝謝!!

回答

1

由於您正在重新創建您的數據,我建議藉此機會對它進行一點改造。這將是最簡單的選擇。例如,將狀態作爲整數存儲在數據中,而不是字符串或字符串之外。你可以有一個額外的字段state_num包含整數值,然後「關鍵」映射到1,「警告」,以2等將很容易通過這個字段進行排序:

"sort" : [ 
    { "state_num" : "asc" } 
] 

如果你不」要重塑您的數據,另一種選擇是使用script-based sorting。例如:

"sort" : { 
    "_script" : { 
    "script" : "switch(doc['state'].value) { case 'CRITICAL': return 1; case 'WARNING': return 2; case 'UNKNOWN': return 3; default: return 100; }", 
    "type" : "number", 
    "order" : "asc" 
    } 
} 
+0

這是非常有幫助的。非常感謝!我最終實現了「state_num」,並且在Kibana可視化中特別有用。謝謝! –