Elasticsearch中的“匹配或空”查询

时间:2019-02-19 12:32:40

标签: java elasticsearch

假设我对2010年至2019年发行的所有电影都有索引; 如何在SQL中将此查询转换为ElasticSearch?

Select *
From movies
Where 
    releaseDate between '2018-01-01' and '2019-01-01' and
    gender is like 'action' and
    (mainActorId = 42 or mainActorId is null)

我想要2018年以来所有具有特定主要演员或根本没有主要演员的动作电影。如何将其转换为ElasticSearch查询?

根据我到目前为止在文档中所读的内容,我可以使用类似以下的内容:

{  
   "size":0,
   "query":{  
      "bool":{  
         "must":[  
            {  
               "range":{  
                  "releaseDate":{  
                     "from":"2018-01-01T00:00:01.531Z",
                     "to":"2019-01-01T00:00:01.531Z",
                     "include_lower":true,
                     "include_upper":true,
                     "boost":1.0
                  }
               }
            },
            {  
               "terms":{  
                  "gender":[  
                     "action"
                  ],
                  "boost":1.0
               }
            },
            {  
               "terms":{  
                  "mainActorId":[  
                     42,
                     56
                  ],
                  "boost":1.0
               }
            }
         ],
         "must_not":[  
            {  
               "exists":{  
                  "field":"mainActorId",
                  "boost":1.0
               }
            }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   }
}

但这并没有给我带来任何成功,即使在2018年发行的动作片中,我想要的主要演员(或者根本没有主要演员)。如果我删除了“ must_not exist”子句,该查询将正常工作,并为我提供想要的主要演员的动作片,但我也希望没有主要演员的动作片...

1 个答案:

答案 0 :(得分:2)

到目前为止很好的开始!!您快到了,请参阅下面的查询,它应该可以完成您所期望的操作:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "releaseDate": {
              "from": "2018-01-01T00:00:01.531Z",
              "to": "2019-01-01T00:00:01.531Z",
              "include_lower": true,
              "include_upper": true,
              "boost": 1
            }
          }
        },
        {
          "terms": {
            "gender": [
              "action"
            ],
            "boost": 1
          }
        }
      ],
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "mainActorId"
                }
              }
            ]
          }
        },
        {
          "terms": {
            "mainActorId": [
              42,
              56
            ]
          }
        }
      ],
      "minimum_should_match": 1,
      "adjust_pure_negative": true,
      "boost": 1
    }
  }
}