如何在ElasticSearch中查询一个文档后跟另一个文档

时间:2015-02-14 06:06:08

标签: elasticsearch

在ElasticSearch中,是否有可能在另一个文档的日期范围内查找文档?例如,如果带有stringa的文档是在包含stringb的文档的5分钟内创建的,则返回“包含stringa的任何文档,然后是stringb的查询”由_timestamp确定??

例如,我从中提取的日志可能会如此读取(当然,它实际上是简化的,它实际上是嵌套的JSON对象,这是我尝试使用ES而不是SQL执行此操作的原因之一):< / p>

{"timestamp": "DATETIME1", "username": "foo", "eventname": "stringa"}
{"timestamp": "DATETIME2", "username": "foo", "eventname": "spam"}
{"timestamp": "DATETIME3", "username": "bar", "eventname": "stringa"}
{"timestamp": "DATETIME4", "username": "bar", "eventname": "cake"}
{"timestamp": "DATETIME5", "username": "foo", "eventname": "stringb"}
{"timestamp": "DATETIME6", "username": "bar", "eventname": "stringb"}

在ES中,这些行最终会成为6个不同的文档。

我正在尝试构建一个查找用户用户名的查询,但前提是包含stringa的文档在包含stringb的文档中(例如5分钟)包含相同的用户名字段值。

我有以下查询:

{
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "eventname": "stringa"
                    }
                },
                {
                    "term": {
                        "eventname": "stringb"
                    }
                }
            ]
        }
    },
    "aggs": {
        "by_username": {
            "terms": {
                "field": "username"
            },
            "aggs": {
                "by_eventname": {
                    "terms": {
                        "field": "eventname"
                    },
                    "aggs": {
                        "max_timestamp": {
                            "max": {
                                "field": "timestamp"
                            }
                        }
                    }
                }
            }
        }
    }
}

但它并没有按照我想要的方式运行 - 它肯定会将用户名显示为存储桶,其中包含事件名称,以及每个事件的最大时间戳(我真的只想要最新的每种类型的事件我都是感兴趣)但我无法弄清楚如何引用每个桶中的文档以使它们相互比较并确定时间戳是否足够接近。

在SQL中,我可以使用子查询或CTE执行此操作,但这不是SQL,我不确定我是否遇到了ES的限制或是否可能。

0 个答案:

没有答案