В этой статье мы говорим о изменении типа данных идентификаторов документов в Manticore Search 3.0.
В предыдущих версиях идентификаторы документов были беззнаковыми большими целыми числами. Это изменилось в 3.0, когда мы перешли на знаковые большие целые числа. Причиной этого решения было желание сделать идентификаторы документов единообразными с атрибутами 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.