2015-08-18 42 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可视化中特别有用。谢谢! –