В этой статье мы обсуждаем изменение типа данных идентификатора документа в Manticore Search 3.0.
В предыдущих версиях идентификаторы документов были беззнаковыми большими целыми числами. Это изменилось в версии 3.0, когда мы перешли на знаковые большие целые числа. Причина этого решения заключалась в том, чтобы сделать идентификаторы документов одинаковыми с атрибутами типа bigint, которые являются знаковыми, поскольку в большинстве случаев даже знаковые bigint должны быть достаточными, и к тому же мы переходим к автоматически генерируемым идентификаторам.
Однако в редких случаях это изменение может стать проблемой, и в этой статье мы более подробно рассмотрим различия и то, как решить проблему, если она возникнет.
Беззнаковые большие целые числа поддерживают значения от 0 до 18,446,744,073,709,551,615 ( 264-1), тогда как знаковые большие целые числа могут принимать значения от −9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 ( −263 до 263−1) ). Знаковой положительный диапазон достаточно велик, чтобы вместить большие наборы данных (по крайней мере, не известно ни одной коллекции Manticore, превышающей невероятные 9+ квадриллионов документов). Проблема возникает только тогда, когда идентификатор документа не является последовательным значением, а представляет собой хеш, использующий беззнаковый большой целый. Для таких случаев, если невозможно перейти к хешу, который помещается в знаковый тип, можно использовать довольно простое преобразование для хранения и получения хешей, которое объясняется ниже.
В случае RealTime‑индексов поддержка автоматически генерируемых идентификаторов будет добавлена в ближайшее время. В случаях, когда RT‑идентификатор документа не был получен из базы данных, а был сгенерирован (хешем или другими методами), ситуация упростится, когда автоматическая генерация будет происходить на стороне Manticore.
Почему не поддерживать оба типа данных?
Поддержка как знаковых, так и беззнаковых идентификаторов в Manticore сейчас вызвала бы больше проблем, чем пользы. Например, некоторые клиенты строго требуют определённые типы данных в ответах. Отправка беззнаковых значений в ответах вызвала бы много путаницы, поскольку клиенты ожидают знаковый большой целый.
Как справиться с этим изменением?
Чтобы соответствовать изменению в Manticore Search, тип идентификатора документа может потребовать изменения в вашем приложении и источниках данных. Если идентификаторы хранятся в базе данных, но они никогда не выходят за пределы положительного знакового диапазона ( 263 -1), то всё просто: просто преобразуйте столбец в знаковый тип. Если ваши идентификаторы превышают это значение, числа необходимо преобразовать в знаковые диапазоны.
Значения, превышающие положительный знаковый диапазон ( 263 -1), можно превратить в отрицательные числа, вычитая из них 264: это преобразует 263 (первое число выше положительного знакового диапазона) в -263, а 264-1 (наибольший возможный беззнаковый большой целый) — в -1. Это также можно использовать, если вы генерируете идентификаторы на основе хеш‑функции, возвращающей беззнаковые большие целые.
Например, в MySQL для преобразования беззнакового большого целого в знаковый большой целый можно использовать IF (id>>63, -(~id) - 1,id). Чтобы обратно преобразовать «отображённое» знаковое число в беззнаковое, можно использовать IF(signed_id<0, ~0^~signed_id,signed_id) . Причина использования битовых функций заключается в том, что MySQL поддерживает битовые функции только для чисел больше 9223372036854775807 (63 бита).
SELECT id,if (id>>63, -(~id) - 1,id) AS mapped_to_signed,
signed_id, if (signed_id<0, ~0^~signed_id,signed_id) AS unsigned_from_mapped
FROM test ORDER BY id
| id | unsigned_to_mapped | signed_id | unsigned_from_mapped |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 9223372036854775807 | 9223372036854775807 | 9223372036854775807 | 9223372036854775807 |
| 9223372036854775808 | -9223372036854775808 | -9223372036854775808 | 9223372036854775808 |
| 9223372036854775809 | -9223372036854775807 | -9223372036854775807 | 9223372036854775809 |
| 18446744073709551613 | -3 | -3 | 18446744073709551613 |
| 18446744073709551614 | -2 | -2 | 18446744073709551614 |
| 18446744073709551615 | -1 | -1 | 18446744073709551615 |
Если вы используете строго типизированные языки (например, .NET), вам необходимо проверить код, чтобы убедиться, что он ожидает знаковые идентификаторы документов в ответах поиска, а не беззнаковые.
Мы знаем, что это изменение может вызвать некоторые проблемы, но это единовременное изменение, которое необходимо выполнить, чтобы воспользоваться последней версией Manticore Search.