首页 > 解决方案 > 查询 ElasticSearch - 在不同时间匹配的多个术语

问题描述

一直在为如何做到这一点而绞尽脑汁,但无法提出解决方案。希望堆栈可以提供帮助。

我有一个标识符(我们称之为对象 id - OID)是:

1) 用于跟踪交易链;2) 不保证在 5 分钟间隔之外是唯一的。

用英语“我想获取所有文档:(在时间 x 和 y 之间有 oid1 的数据)或(在时间 w 和 z 之间有 oid2 的数据)或 ....”

因为我正在处理大量数据(并且希望避免对每个 OID 进行 1 次查询),所以我想做的是获取 OID 列表,为每个 OID 设置时间限制,然后一次查询 ES。我认为我能做的是:

    {
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "oid": "12ac419512ac4195"
          },

          "range": {
            "startTime": {
              "from": "2019-01-04T21:31:00.000Z",
              "to": "2019-01-04T21:34:00.000Z"
            }
          }

        },

        {
          "match_phrase": {
            "oid": "34df261834df2618"
          },

          "range": {
            "startTime": {
              "from": "2019-01-04T21:35:00.000Z",
              "to": "2019-01-04T21:40:00.000Z"
            }
          }

        }

      ],
      "minimum_should_match": 1
    }
  }
}

只要我删除时间(“我想获取 oid1 或 oid2 或 oid2”),这工作正常,但时间范围似乎让 ES 不高兴。

有没有办法做到这一点?或者我是否坚持每个 OID 一个查询。

标签: elasticsearchlogstashkibanaelastic-stackelasticsearch-5

解决方案


您需要另一个子级别的 bool + must 子句将匹配 + 范围绑定在一起。

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match_phrase": {
                  "oid": "12ac419512ac4195"
                }
              },
              {
                "range": {
                  "startTime": {
                    "from": "2019-01-04T21:31:00.000Z",
                    "to": "2019-01-04T21:34:00.000Z"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "match_phrase": {
                  "oid": "34df261834df2618"
                }
              },
              {
                "range": {
                  "startTime": {
                    "from": "2019-01-04T21:35:00.000Z",
                    "to": "2019-01-04T21:40:00.000Z"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

推荐阅读