api - Elasticsearch API 返回相同数量的文档
问题描述
再会!
Elasticsearch API 出现问题。我编写了一个脚本,在其中执行了几个不同的请求。在这些查询中,我尝试计算过去半小时内来自不同主机的文档数量。
在所有请求中,我使用“GET /log/_count”
"query": {
"bool": {
"must": [
{
"match": { "host": "xxx" }
},
{
"range": {
"@timestamp": {
"gte": "now-30m",
"lte": "now"
}
}
}
]
}
}
"query": {
"bool": {
"must": [
{
"match": { "host" : "yyy" }
},
{
"range": {
"@timestamp": {
"gte": "now-30m",
"lte": "now"
}
}
}
]
}
}
"query": {
"bool": {
"must": [
{
"match": { "host" : "zzz" }
},
{
"range": {
"@timestamp": {
"gte": "now-30m",
"lte": "now"
}
}
}
]
}
}
另一个验证请求:
"query": {
"bool": {
"filter": {
"range": {
"@timestamp": {
"gte": "now-30m",
"lte": "now"
}
}
}
}
}
但是当我运行脚本时,我得到的文档数量大致相同。即使在最后一个应该显示所有文档总和的请求中,也会显示相同的数量,尽管它只配置了“范围”。
XXX: 15691
年年:15689
ZZZ:15689
全部:15689
这是正常行为,还是我做错了什么?
UPD。
"query": {
"bool": {
"must": [
{
"match_phrase": { "host" : "xxx" }
},
{
"range": {
"@timestamp": {
"gte": "now-30m",
"lte": "now"
}
}
}
]
}
}
解决方案
这可能是预期的行为。
原因是您有两个适用于now
. 您可能会在 time1 上执行 query1,在 time1 上执行 query2。now
time1 和 time2 是不同的。
同时(time2 - time1),可能会添加一些文档。因此,您会看到细微的差别。
要获得所有主机的计数,
GET logs/_search
{
"size": 0,
"aggs": {
"hosts": {
"filters": {
"filters": {
"xxx": {
"match": {
"host": "xxx"
}
},
"yyy": {
"match": {
"host": "yyy"
}
}
}
},
"aggs": {
"range": {
"date_range": {
"field": "@timestamp",
"ranges": [
{
"to": "now-30m"
},
{
"from": "now"
}
]
}
}
}
}
}
}
如果您的值超过一个单词,则需要使用match phrase
than match
。
推荐阅读
- excel - 如何根据excel中的相邻单元格设置类型持续时间的数据栏
- c++ - 如何为环面创建索引
- ios - iOS 操作扩展,从 Safari 共享 PDF 失败
- r - 在R中使用马氏距离最近邻匹配进行子分类
- kubernetes - Kubernetes 无法访问多工作节点中的 pod
- ios - Info.plist 中 CFBundleDocumentTypes 键的值必须是字典数组
- javascript - 我如何检测 iframe 视频是否不起作用
- assembly - 在汇编程序中将整数运算的结果转换为十进制
- matlab - 如何在 Matlab R2018b 中使用图像上的 4 个角绘制矩形?
- python - 如何获取列表中的完整元素名称