database - 如何使用 elasticsearch 创建子查询
问题描述
我需要为以下条件创建一个关于 elasticsearch 的查询。
当添加“rabbitmq.queue.name”属性的最后一个元素等于“service_test_error”并且“rabbitmq.queue.messages.total.count”中的值不为“0”时
下面的 sql 查询适用于我的搜索,但我无法使用 elasticsearch 执行相同的查询
select * from metric where rabbitmq.queue.messages.total.count != '0' and rabbitmq.queue.name = 'service_test_error' and timestamp = (select max(timestamp) from metric where rabbitmq.queue.name = 'service_test_error')
以下这些记录是我的 metric-xpto 索引中存在的示例
[
{
"_index": "metric-xpto",
"_type": "_doc",
"_id": "jYP1WnEBmYyEo7K68Zme",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2020-04-08T18:03:14.899Z",
"rabbitmq": {
"queue": {
"name": "service_test_error",
"messages": {
"total": {
"count": 0
}
}
}
}
}
},
{
"_index": "metric-xpto",
"_type": "_doc",
"_id": "jYP1WnEBmYyEo7K68Zme",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2020-04-07T18:03:14.899Z",
"rabbitmq": {
"queue": {
"name": "service_test_error",
"messages": {
"total": {
"count": 3
}
}
}
}
}
},
{
"_index": "metric-xpto",
"_type": "_doc",
"_id": "jYP1WnEBmYyEo7K68Zme",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2020-04-03T17:03:14.899Z",
"rabbitmq": {
"queue": {
"name": "service_alpha_test_error",
"messages": {
"total": {
"count": 8
}
}
}
}
}
},
{
"_index": "metric-xpto",
"_type": "_doc",
"_id": "jYP1WnEBmYyEo7K68Zme",
"_version": 1,
"_score": null,
"_source": {
"@timestamp": "2020-04-03T18:03:14.899Z",
"rabbitmq": {
"queue": {
"name": "service_test_error",
"messages": {
"total": {
"count": 8
}
}
}
}
}
}
]
如何使用弹性搜索创建类似的查询?
解决方案
在查询部分,您只能获取最高记录,然后检查必须在客户端的消息计数。
在聚合部分可以做到这一点。
{
"size": 0,
"query": {
"term": {
"rabbitmq.queue.name.keyword": {
"value": "service_test_error"
}
}
},
"aggs": {
"date": {
"terms": {
"field": "@timestamp",
"size": 1,
"order": {
"_term": "desc"
}
},
"aggs": {
"message_count": {
"terms": {
"field": "rabbitmq.queue.messages.total.count",
"size": 10
},
"aggs": {
"filter_count": {
"bucket_selector": {
"buckets_path": {
"key": "_key"
},
"script": "if(params.key>0) return true; else return false;"
}
}
}
},
"select_timestamp": {
"bucket_selector": {
"buckets_path": {
"key": "message_count._bucket_count"
},
"script": "if(params.key>0) return true;else false;"
}
}
}
}
}
}
结果:如果最上面的记录消息计数为零,则存储桶将为空,否则将有数据
"hits" : {
"total" : {
"value" : 7,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"date" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 6,
"buckets" : [ ]
}
}
弹性搜索没有连接,因此在查询中不可能将一个文档与另一个文档进行比较
推荐阅读
- c - libhdfs - 无法打开共享库 libhdfs.so.0.0.0.0
- java - 使用的石英表
- python - 如何在没有某些功能的情况下从字符串中删除尾随空格?
- vb.net - 在 datagridvied vb.net 中的输入或选项卡上显示数据
- python - YouTube 字幕 API 返回不准确的数据
- assembly - 我必须在汇编中编写 ac 代码,但我在使用 CPUlator 查看代码输出时遇到问题
- nuget - 将静态文件从 nuget 包复制到项目根目录
- python - 如何为具有复杂布局扫描文档的数据图像训练 tesseract 4
- oauth-2.0 - PingFederate 中 resumePath 有什么用
- postgresql - 嵌套存储过程的增量进展 (Postgres)