запрос на совпадение или ноль - PullRequest
0 голосов
/ 19 февраля 2019

Предположим, у меня есть индекс со всеми фильмами, выпущенными с 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 Существовать», запрос будет работать нормально и даст мне боевики с основными актерами, которых я хочу, но я также хочу боевики без главных актеров ...

1 Ответ

0 голосов
/ 19 февраля 2019

Отличное начало !!Вы почти там, смотрите запрос ниже, он должен делать то, что вы ожидаете:

{
  "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
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...