针对相同范围的弹性搜索过滤会带来不同数量的结果

时间:2016-09-29 08:35:56

标签: python elasticsearch

我想执行以下查询

SELECT * 
FROM logs
WHERE dst != "-" 
AND @timestamp > "a date before" AND @timestamp < "now"

我使用python elasticsearch sdk,并形成了两个用于测试的查询

from elasticsearch import Elasticsearch
from datetime import datetime, timedelta

now = datetime.now()
four_hours_before = now - timedelta(hours=4)

es = Elasticsearch("http://es.domain.com:9200")

query_bool_filter = {
    'query': {
        'bool': {'
             filter': {
                 'bool': {
                     'must_not': {
                         'term': {
                             'dst': '-'
                          }
                      }, 
                      'must': {
                          'range': {
                              '@timestamp': {
                                  'gte': four_hours_before, 
                                  'lte': now
                                  }
                              }
                          }
                      }
                  }
              }
          }
      }

和第二个使用must_not与过滤器分开的查询

query_bool_and_filter = {
    'query': {
        'bool': {
            'filter': {
                'range': {
                    '@timestamp': {
                        'gte': four_hours_before, 
                        'lte': now
                    }
                }
            },
            'must_not': {
                'term': {
                    'dst': '-'
                }
            }
        }
    }
}

当我使用python sdk中的搜索执行查询时,我会比较返回结果中的总字段,它的不同之处如下:

res1 = es.search(index="myindex", body=query_bool_filter)
res2 = es.search(index="myindex", body=query_bool_and_filter)

res1.get('hits').get('total') #prints 43197
res2.get('hits').get('total') #prints 43215

为什么我会得到不同的数字,因为范围相同?

1 个答案:

答案 0 :(得分:2)

您可以尝试logging查看弹性搜索查询的实际情况。