Разница в результатах поиска RediSearch
Я использую Redis вместе с модулями RedisJSON и RediSearch. У меня есть вопрос о модуле RediSearch, особенно о FT.SEARCH.
Мой индекс выглядит так:
FT.CREATE chainIdIdx ON JSON PREFIX 1 chain-id. SCHEMA $.message-ids.*.redis-routing-key AS routingkeys TAG $.updated-at AS updatedAt TEXT SORTABLE
На данный момент существует более 2 миллионов записей ключей с префиксом chain-id.*
Вот поисковые запросы:
1.) Взгляните на первый вызов:
FT.SEARCH "chainIdIdx" * SORTBY updatedAT DESC LIMIT 0 2
результат поиска: всего найдено 182299 документов.
Итого документы совпали и даже результат отличается от каждого звонка.
Почему есть разница? Я ожидал, что будет такая же сумма и тот же результат. Другое дело, что должны отображаться самые новые ключи базы данных, которые будут (прямо сейчас) с помощью значения updatedAt, такого как 2022-12-01 xx:xx:xx.
Ключи правильно хранятся в базе данных, но результат поиска отличается от ожидаемого.
Я попытался поиграть с установкой индекса по-другому, но это ухудшило ситуацию. Также я не уверен, связано ли это с конфигурацией или каким-либо ограничением, потому что количество ключей огромно и будет расти.
1 ответ
Время поиска истекло, и он возвращает то, что было найдено до сих пор. По умолчанию время ожидания установлено на 500 мс. Вы можете изменить это поведение и время ожидания с помощью команды FT.CONFIG, изменив файл redis.conf и несколькими другими способами. Я покажу вам, как это сделать с помощью команд Redis, но вы можете — и, вероятно, захотите — прочитать все подробности сами.
Чтобы изменить значение тайм-аута, просто укажите новое значение в миллисекундах:
redis.cloud> FT.CONFIG.SET TIMEOUT 1000
Установка его на 0 отключает тайм-аут.
Поведение по умолчанию после тайм-аута - просто вернуть то, что было найдено до сих пор. Однако вы можете изменить его так, чтобы RediSearch выдавал ошибки , когда время истекло:
redis.cloud> FT.CONFIG.SET ON_TIMEOUT FAIL
Если вы хотите вернуть значение по умолчанию и просто вернуть то, что было получено до сих пор:
redis.cloud> FT.CONFIG.SET ON_TIMEOUT RETURN
Надеюсь это поможет!