Условия Elasticsearch 6.3.2 соответствуют пустому массиву «плюс» другим - PullRequest
0 голосов
/ 09 мая 2019

В моей базе данных пост может иметь ноль (0) или более категорий, представленных в виде массива.

Когда я делаю запрос, чтобы посмотреть в этих категориях, передавая некоторые значения:

{
  "query": {
    "bool": {
      "should": {
        "terms": {
          "categories": ["First", "Second", "And so on"]
        }
      }
    }
  }
}

И это хорошо работает, у меня есть ожидаемые записи. Но проблема возникает, когда я хочу включить те сообщения, где категории - это пустой массив ([]).

Сейчас я обновляю старую версию ES (1.4.5) до версии 6.3.2, и этот код был создан с использованием «отсутствующего», которое устарело.

Я попытался изменить отображение, добавив famouse "null_value": "NULL", и запрос тогда, но не сработало. Также пробовал комбинацию must с must_not, как предлагалось для обновления «отсутствует», но не сработало.

Как мне этого добиться? Это означает, что если я проиндексировал:

Post.new(id: 1, title: '1st', categories: [])
Post.new(id: 2, title: '2nd', categories: ['news', 'tv'])
Post.new(id: 3, title: '3rd', categories: ['tv', 'trending'])
Post.new(id: 4, title: '4th', categories: ['movies'])
Post.new(id: 5, title: '5th', categories: ['technology', 'music'])

Результат должен возвращать посты № 1, 2 y 3 - те, которые имеют «новости», «тв» или пустой массив в качестве категорий.

1 Ответ

2 голосов
/ 09 мая 2019

Отсутствие может быть воспроизведено с помощью exists внутри must_not.Вы должны изменить запрос, как показано ниже:

{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "categories": [
              "First",
              "Second",
              "And so on"
            ]
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "categories"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

Вы можете прочитать об этом здесь .

...