Python &引用;“订购”;弹性搜索
我正在将sqlite3中的数据库重新创建为elasticsearch中的数据库 在一个python脚本中,我有一行代码,按照类似的状态对sqlite3数据库进行排序Python &引用;“订购”;弹性搜索,python,sorting,
elasticsearch,sqlite,Python,Sorting,
elasticsearch,Sqlite,我正在将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
`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" }
]
如果您不想重新构建数据,另一个选项是使用。例如:
"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"
}
}
这很有帮助。非常感谢你!我最终只是实现了“state_num”,它在Kibana可视化过程中特别有用。非常感谢。