Elasticsearch 查找 'delivered' 但不是 'opened' 的所有消息
Elasticsearch find all messages that were 'delivered' but not 'opened'
我有以下elasticsearch索引数据:
id|message_id| action|
1| 1|delivered|
2| 1| opened|
3| 2|delivered|
4| 3|delivered|
5| 4|delivered|
6| 5| opened|
如何查找所有 'not opened' 条消息?
预期结果:
id|message_id| action|
3| 2|delivered|
4| 3|delivered|
这对于单个查询来说会很困难,因为您的数据是规范化的,因此需要对自身进行连接,而 AFAIK 在 ES 中实际上是不可能的。我认为有两种解决方案:
- 使用 action 的嵌套字段对数据进行反规范化。
- 使用两个查询:在第一个查询中,您检索 已发送 的所有消息。对于第二个查询,您使用第一个查询中的 message_ids 并使用 bool 过滤器组合
ids filter
和 term filter
以获得那些未打开。
使用不过滤器。这是一个例子:
GET index1/type1/_search
{
"size": 10,
"query": {
"filtered": {
"filter": {
"not": {
"filter": {
"term": {
"action": {
"value": "opened"
}
}
}
}
}
}
}
}
我有以下elasticsearch索引数据:
id|message_id| action|
1| 1|delivered|
2| 1| opened|
3| 2|delivered|
4| 3|delivered|
5| 4|delivered|
6| 5| opened|
如何查找所有 'not opened' 条消息? 预期结果:
id|message_id| action|
3| 2|delivered|
4| 3|delivered|
这对于单个查询来说会很困难,因为您的数据是规范化的,因此需要对自身进行连接,而 AFAIK 在 ES 中实际上是不可能的。我认为有两种解决方案:
- 使用 action 的嵌套字段对数据进行反规范化。
- 使用两个查询:在第一个查询中,您检索 已发送 的所有消息。对于第二个查询,您使用第一个查询中的 message_ids 并使用 bool 过滤器组合
ids filter
和term filter
以获得那些未打开。
使用不过滤器。这是一个例子:
GET index1/type1/_search
{
"size": 10,
"query": {
"filtered": {
"filter": {
"not": {
"filter": {
"term": {
"action": {
"value": "opened"
}
}
}
}
}
}
}
}