带elasticsearch的复合查询

wbgh16ku  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(325)

我正在尝试执行搜索,目标条件是( activationDate 在射程内 15988896001602051579 )或者 someFlag = true .
下面是我尝试过的查询,但它不会产生任何带有 someFlag = true (即使尺寸很大,例如5000)。我的elasticsearch有很多 someFlag = true .
总共有大约3000个文档,这个查询返回大约280个文档。

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "activationDate": {
              "gte": 1598889600
            }
          }
        },
        {
          "range": {
            "activationDate": {
              "lte": 1602051579
            }
          }
        }
      ],
      "should": {
        "match": {
          "someFlag": true
        }
      }
    }
  },
  "from": 1,
  "size": 1000
}

我错过什么了吗?

1dkrff03

1dkrff031#

将must替换为should,并按原样将minimum\u should\u match=1设置为or查询,如果任何记录只满足一个ceiteria,就可以了。接下来,将这两个范围标准减少到一个,将gte和lte结合起来。

h79rfbju

h79rfbju2#

这应该起作用:

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "range": {
                  "activationDate": {
                    "gte": 1598889600,
                    "lte": 1602051579
                  }
                }
              },
              {
                "term": {
                  "someFlag": true
                }
              }
            ]
          }
        }
      ]
    }
  }
}

理论上也应该如此:

{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "activationDate": {
              "gte": 1598889600,
              "lte": 1602051579
            }
          }
        },
        {
          "term": {
            "someFlag": true
          }
        }
      ]
    }
  }
}

但是,我给出的第一个查询将bool子句 Package 在过滤器上下文中(这样就不需要评分,查询就可以缓存了)。
您的bool查询可能不起作用,因为您正在使用 match 查询,而不是 term . match 通常仅用于文本搜索。

相关问题