Это примеры документов (на основе событий), проиндексированных в моем кластере ES версии 6.8
{
"user_id": "user1",
"account_id": "account1",
"event_name": "event-1",
"created_dt": "2019-09-30T08:40:42.297Z"
}
{
"user_id": "user1",
"account_id": "account1",
"event_name": "event-2",
"created_dt": "2019-10-30T08:40:42.297Z"
}
{
"user_id": "user2",
"account_id": "account1",
"event_name": "event-1",
"created_dt": "2019-10-30T08:40:42.297Z"
}
Отображение для документа
{
"mappings": {
"properties": {
"user_id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"account_id": {
"type": "keyword"
},
"event_name": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"created_dt": {
"type": "date"
}
}
}
}
Я пытаюсь выполнить выборкусписок пользователей, которые в установленный промежуток времени приняли имя-события «событие-1» и «событие-2».
В приведенном ниже запросе, имеющем 2, должно быть указано одно и то же поле «имя-события», которое в конечном итоге приводит к пустым значениям.
{
"query": {
"bool": {
"must": [
{
"match": {
"account_id": "account1"
}
},
{
"bool": {
"must": [
{
"match": {
"event_name.raw": "event-1"
}
},
{
"range": {
"created_dt": {
"gte": "2019-09-30",
"lte": "2019-10-30"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"match": {
"event_name.raw": "event-2"
}
},
{
"range": {
"created_dt": {
"gte": "2019-10-30",
"lte": "2019-11-05"
}
}
}
]
}
}
]
}
},
"size": 0,
"aggs": {
"user_list": {
"terms": {
"field": "user_id.raw"
}
}
}
}
Каков идеальный способ получения нужных групповых документов? Это может быть сделано в SQL с использованием IN и подзапроса, но в ES
выглядит не так просто