⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Migrating to Manticore 3: document ids

В этой статье мы обсуждаем изменение типа данных идентификатора документа в 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
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