Elasticsearch возвращает строку с существующим полем для запроса «не должно существовать» - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть индекс с необязательным полем Дата / Время, называемый lastChackoutDate. Попытка отфильтровать строки по запросу range или term возвращает 0 строк, но я знаю, что в некоторых документах есть значение для этого поля. Запрос Mappings возвращает мне ожидаемый ответ:

... ,
"lastCheckoutDate": {
    "type": "date"
},
...

Попытка определить, какой запрос может вернуть мне результат, которого я жду, в конечном итоге привела меня к выражению:

{
  "from": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "lastCheckoutDate"
                }
              }
            ],
            "must": [
              {
                "nested": {
                  "path": "nested_path",
                  "query": {
                    "term": {
                      "nested_path.id": {
                        "value": "some_unique_id"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 50,
  "sort": [
    {
      "displaySequence": {
        "order": "asc"
      }
    }
  ]
}

, которое вернуло одна строка с существующим путем / значением:

hits
    [0]
        _source
            lastCheckoutDate: 2020-01-23T00:00:00

explain этого запроса не пролила свет на детали ответа "существует": ConstantScore (+ ToParentBlockJoinQuery (nested_path.id: some_unique_id) -ConstantScore (_field_names: lastCheckoutDate)), продукт: Так есть ли способы определить, почему поле невидимо для запроса? Это прекрасно работает для тестовой базы данных, которая создается и удаляется каждый раз, но существующее хранилище всегда дает мне 0 совпадений для любого действительного (из моего POV) запроса. Из c я выполнил действие по миграции для существующей базы данных (по крайней мере, каким-то образом отображалась информация для нового поля). В документации Elasti c приведены некоторые примеры того, почему «существующий» запрос может завершиться ошибкой: - Поле в источнике JSON равно нулю или [] - Поле имеет «индекс»: ложно установлено в отображении - Длина значения поля превысила значение параметра ignore_above в отображении - Значение поля было искажено, а ignore_malformed было определено в отображении Но я не уверен, что какой-либо вариант верен для моего случая.

1 Ответ

0 голосов
/ 24 февраля 2020

Новые документы были добавлены до миграции. Таким образом, AFAIK Elasti c не будет повторно индексировать существующие документы, пока они не будут обновлены в индексе.
Так вот почему в тестовой базе данных у меня не было проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...