Переход на Manticore 3: идентификаторы документов

В этой статье мы говорим о изменении типа данных идентификаторов документов в 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
idunsigned_to_mappedsigned_idunsigned_from_mapped
0000
1111
9223372036854775807922337203685477580792233720368547758079223372036854775807
9223372036854775808-9223372036854775808-92233720368547758089223372036854775808
9223372036854775809-9223372036854775807-92233720368547758079223372036854775809
18446744073709551613-3-318446744073709551613
18446744073709551614-2-218446744073709551614
18446744073709551615-1-118446744073709551615

Если вы используете языки с строгой типизацией (например, .NET), вам необходимо пересмотреть код, чтобы убедиться, что он будет ожидать, что идентификаторы документов в ответах поиска будут знаковыми, а не беззнаковыми.

Мы понимаем, что это изменение может создать некоторые проблемы, но это одноразовое изменение, которое необходимо сделать, чтобы наслаждаться последними версиями Manticore Search.

Установить Manticore Search

Установить Manticore Search