我正在将 sqlite3 中的数据库重新创建为 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客户端复制这个“按情况排序”?
使用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"})
谢谢!!
最佳答案
由于您正在重新创建数据,我建议借此机会对其进行一些改造。这将是最简单的选择。例如,将状态作为整数而不是字符串存储在数据中。您可以有一个额外的字段 state_num
,其中包含整数值,然后将“CRITICAL”映射到 1,将“WARNING”映射到 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"
}
}
关于python - "Order By" Elasticsearch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082355/