查询ElasticSearch-在不同时间匹配多个术语

时间:2019-01-13 16:45:46

标签: elasticsearch logstash kibana elastic-stack elasticsearch-5

我一直在想如何做到这一点,但是无法提出解决方案。希望堆栈可以提供帮助。

我遇到一种情况(标识符称为对象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只能执行一个查询。

1 个答案:

答案 0 :(得分:0)

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

{
  "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"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}