首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch查询同一字段的多个条件

Elasticsearch查询同一字段的多个条件
EN

Stack Overflow用户
提问于 2019-11-10 17:33:44
回答 1查看 350关注 0票数 0

这些是在我的ES集群6.8版中索引的示例文档(基于事件

代码语言:javascript
复制
{
  "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"
}

文档的映射

代码语言:javascript
复制
{
"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"
  }
}
}
}

我试图完成的是动态获取在规定时间内使用event_name "event-1“和"event-2”的用户列表。

下面具有2的查询必须以相同的字段"event_name“为条件,最终结果为空。

代码语言:javascript
复制
{
"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中看起来再简单不过了

EN

回答 1

Stack Overflow用户

发布于 2019-11-10 17:44:57

尝试此查询

代码语言:javascript
复制
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "account_id": "account1"
          }
        },
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "event_name.raw": "event-1"
                      }
                    },
                    {
                      "range": {
                        "created_dt": {
                          "gte": "2019-09-30",
                          "lte": "2019-10-30"
                        }
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "event_name.raw": "event-2"
                      }
                    },
                    {
                      "range": {
                        "created_dt": {
                          "gte": "2019-10-30",
                          "lte": "2019-11-05"
                        }
                      }
                    }
                  ]
                }
              }
            ],
            "filter": {
              "term": {
                "event_name.raw": "event-2"
              }
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "user_list": {
      "terms": {
        "field": "user_id.raw"
      }
    }
  }
}

希望能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58787339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档