ALTER TABLE table ADD COLUMN column_name [{INTEGER|INT|BIGINT|FLOAT|BOOL|MULTI|MULTI64|JSON [secondary_index='1']|STRING|TEXT [INDEXED [ATTRIBUTE]]|TIMESTAMP}] [engine='columnar']
ALTER TABLE table DROP COLUMN column_name
ALTER TABLE table MODIFY COLUMN column_name bigint
Эта функция поддерживает добавление только одного поля за раз для RT-таблиц или расширение столбца int до bigint. Поддерживаемые типы данных:
int- целочисленный атрибутtimestamp- атрибут временной меткиbigint- атрибут большого целого числаfloat- атрибут с плавающей запятойbool- булев атрибутmulti- многозначный целочисленный атрибутmulti64- многозначный атрибут bigintjson- атрибут json; используйтеsecondary_index='1'для создания вторичного индекса по JSONstring/text attribute/string attribute- строковый атрибутtext/text indexed stored/string indexed stored- полнотекстовое индексируемое поле с исходным значением, хранящимся в docstoretext indexed/string indexed- полнотекстовое индексируемое поле, только индексируемое (исходное значение не хранится в docstore)text indexed attribute/string indexed attribute- полнотекстовое индексируемое поле + строковый атрибут (исходное значение не хранится в docstore)text stored/string stored- значение будет храниться только в docstore, не полнотекстово индексироваться и не является строковым атрибутом- добавление
engine='columnar'к любому атрибуту (кроме json) приведет к его хранению в колоночном хранилище
- ❗Рекомендуется создать резервную копию файлов таблицы перед выполнением
ALTER, чтобы избежать повреждения данных в случае внезапного отключения питания или других подобных проблем. - Запросы к таблице невозможны, пока добавляется столбец.
- Значения вновь созданного атрибута устанавливаются в 0.
ALTERне будет работать для распределенных таблиц и таблиц без каких-либо атрибутов.- Нельзя удалить столбец
id. - При удалении поля, которое одновременно является полнотекстовым полем и строковым атрибутом, первый
ALTER DROPудаляет атрибут, второй — полнотекстовое поле. - Добавление/удаление полнотекстового поля поддерживается только в режиме RT.
- Example
mysql> desc rt;
+------------+-----------+
| Field | Type |
+------------+-----------+
| id | bigint |
| text | field |
| group_id | uint |
| date_added | timestamp |
+------------+-----------+
mysql> alter table rt add column test integer;
mysql> desc rt;
+------------+-----------+
| Field | Type |
+------------+-----------+
| id | bigint |
| text | field |
| group_id | uint |
| date_added | timestamp |
| test | uint |
+------------+-----------+
mysql> alter table rt drop column group_id;
mysql> desc rt;
+------------+-----------+
| Field | Type |
+------------+-----------+
| id | bigint |
| text | field |
| date_added | timestamp |
| test | uint |
+------------+-----------+
mysql> alter table rt add column title text indexed;
mysql> desc rt;
+------------+-----------+------------+
| Field | Type | Properties |
+------------+-----------+------------+
| id | bigint | |
| text | text | indexed |
| title | text | indexed |
| date_added | timestamp | |
| test | uint | |
+------------+-----------+------------+
mysql> alter table rt add column title text attribute;
mysql> desc rt;
+------------+-----------+------------+
| Field | Type | Properties |
+------------+-----------+------------+
| id | bigint | |
| text | text | indexed |
| title | text | indexed |
| date_added | timestamp | |
| test | uint | |
| title | string | |
+------------+-----------+------------+
mysql> alter table rt drop column title;
mysql> desc rt;
+------------+-----------+------------+
| Field | Type | Properties |
+------------+-----------+------------+
| id | bigint | |
| text | text | indexed |
| title | text | indexed |
| date_added | timestamp | |
| test | uint | |
+------------+-----------+------------+
mysql> alter table rt drop column title;
mysql> desc rt;
+------------+-----------+------------+
| Field | Type | Properties |
+------------+-----------+------------+
| id | bigint | |
| text | text | indexed |
| date_added | timestamp | |
| test | uint | |
+------------+-----------+------------+ALTER TABLE table ft_setting='value'[, ft_setting2='value']
Вы можете использовать ALTER для изменения полнотекстовых настроек вашей таблицы в режиме RT. Однако это влияет только на новые документы, а не на существующие.
Пример:
- создаем таблицу с полнотекстовым полем и
charset_table, которая позволяет только 3 поисковых символа:a,bиc. - затем мы вставляем документ 'abcd' и находим его по запросу
abcd,dпросто игнорируется, так как его нет в массивеcharset_table - затем мы понимаем, что хотим, чтобы
dтоже был доступен для поиска, поэтому добавляем его с помощьюALTER - но тот же запрос
where match('abcd')все равно говорит, что поиск был поabc, потому что существующий документ помнит предыдущее содержимоеcharset_table - затем мы добавляем еще один документ
abcdи снова ищем поabcd - теперь он находит оба документа, и
show metaговорит, что использовалось два ключевых слова:abc(для поиска старого документа) иabcd(для нового).
- Example
mysql> create table rt(title text) charset_table='a,b,c';
mysql> insert into rt(title) values('abcd');
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id | title |
+---------------------+-------+
| 1514630637682688054 | abcd |
+---------------------+-------+
mysql> show meta;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total | 1 |
| total_found | 1 |
| time | 0.000 |
| keyword[0] | abc |
| docs[0] | 1 |
| hits[0] | 1 |
+---------------+-------+
mysql> alter table rt charset_table='a,b,c,d';
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id | title |
+---------------------+-------+
| 1514630637682688054 | abcd |
+---------------------+-------+
mysql> show meta
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total | 1 |
| total_found | 1 |
| time | 0.000 |
| keyword[0] | abc |
| docs[0] | 1 |
| hits[0] | 1 |
+---------------+-------+
mysql> insert into rt(title) values('abcd');
mysql> select * from rt where match('abcd');
+---------------------+-------+
| id | title |
+---------------------+-------+
| 1514630637682688055 | abcd |
| 1514630637682688054 | abcd |
+---------------------+-------+
mysql> show meta;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| total | 2 |
| total_found | 2 |
| time | 0.000 |
| keyword[0] | abc |
| docs[0] | 1 |
| hits[0] | 1 |
| keyword[1] | abcd |
| docs[1] | 1 |
| hits[1] | 1 |
+---------------+-------+Вы можете изменить имя реальной таблицы в режиме RT.
ALTER TABLE table_name RENAME new_table_name;
ПРИМЕЧАНИЕ: Переименование реальной таблицы требует наличия Manticore Buddy. Если это не работает, убедитесь, что Buddy установлен.
- Example
ALTER TABLE table_name RENAME new_table_name;Query OK, 0 rows affected (0.00 sec)ALTER TABLE table RECONFIGURE
ALTER также может перенастроить RT-таблицу в обычном режиме, чтобы новые настройки токенизации, морфологии и другие настройки обработки текста из файла конфигурации вступили в силу для новых документов. Обратите внимание, что существующие документы останутся нетронутыми. Внутренне он принудительно сохраняет текущий RAM-чанк как новый дисковый чанк и корректирует заголовок таблицы, чтобы новые документы токенизировались с использованием обновленных полнотекстовых настроек.
- Example
mysql> show table rt settings;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| settings | |
+---------------+-------+
1 row in set (0.00 sec)
mysql> alter table rt reconfigure;
Query OK, 0 rows affected (0.00 sec)
mysql> show table rt settings;
+---------------+----------------------+
| Variable_name | Value |
+---------------+----------------------+
| settings | morphology = stem_en |
+---------------+----------------------+
1 row in set (0.00 sec)ALTER TABLE table REBUILD SECONDARY
Вы также можете использовать ALTER для перестроения вторичных индексов в заданной таблице. Иногда вторичный индекс может быть отключен для всей таблицы или для одного или нескольких атрибутов внутри таблицы:
- Когда атрибут обновляется, его вторичный индекс отключается.
- Если Manticore загружает таблицу со старой версией вторичных индексов, которая больше не поддерживается, вторичные индексы будут отключены для всей таблицы.
ALTER TABLE table REBUILD SECONDARY перестраивает вторичные индексы из данных атрибутов и снова включает их.
Кроме того, старая версия вторичных индексов может поддерживаться, но будет лишена определенных функций. REBUILD SECONDARY можно использовать для обновления вторичных индексов.
- Example
ALTER TABLE rt REBUILD SECONDARY;Query OK, 0 rows affected (0.00 sec)ALTER TABLE table REBUILD KNN
Команда перерабатывает все векторные данные в таблице и перестраивает KNN-индекс с нуля.
- Example
ALTER TABLE rt REBUILD KNN;Query OK, 0 rows affected (0.00 sec)ALTER можно использовать для изменения ключа API, когда удаленная модель используется для автоэмбеддингов:
ALTER TABLE table_name MODIFY COLUMN column_name API_KEY='key';
- Example
ALTER TABLE rt MODIFY COLUMN vector API_KEY='key';Чтобы изменить список локальных или удаленных узлов в распределенной таблице, используйте тот же синтаксис, который вы использовали для создания таблицы. Просто замените CREATE на ALTER в команде и удалите type='distributed':
ALTER TABLE `distr_table_name` [[local='local_table_name'], [agent='host:port:remote_table'] ... ]
ПРИМЕЧАНИЕ: Изменение схемы распределенной таблицы онлайн требует наличия Manticore Buddy. Если это не работает, убедитесь, что Buddy установлен.
- Example
ALTER TABLE local_dist local='index1' local='index2' agent='127.0.0.1:9312:remote_table';≫ Функции
Возвращает абсолютное значение аргумента.
Возвращает арктангенс от двух аргументов, выраженный в радианах.
BITDOT(mask, w0, w1, ...) возвращает сумму произведений каждого бита маски на его вес. bit0*w0 + bit1*w1 + ...
Возвращает наименьшее целое значение, большее или равное аргументу.
Возвращает косинус аргумента.
Возвращает значение CRC32 строкового аргумента.
Возвращает экспоненту аргумента (e=2.718... в степени аргумента).
Возвращает N-е число Фибоначчи, где N — целочисленный аргумент. То есть аргументы от 0 и выше будут генерировать значения 0, 1, 1, 2, 3, 5, 8, 13 и так далее. Обратите внимание, что вычисления выполняются с использованием 32-битной целочисленной арифметики, поэтому числа начиная с 48-го будут возвращены по модулю 2^32.
Возвращает наибольшее целое значение, меньшее или равное аргументу.
Функция GREATEST(attr_json.some_array) принимает в качестве аргумента массив JSON и возвращает наибольшее значение в этом массиве. Также работает для MVA.
Возвращает результат целочисленного деления первого аргумента на второй аргумент. Оба аргумента должны быть целочисленного типа.
Функция LEAST(attr_json.some_array) принимает в качестве аргумента массив JSON и возвращает наименьшее значение в этом массиве. Также работает для MVA.
Возвращает натуральный логарифм аргумента (с основанием e=2.718...).
Возвращает десятичный логарифм аргумента (с основанием 10).
Возвращает двоичный логарифм аргумента (с основанием 2).
Возвращает больший из двух аргументов.
Возвращает меньший из двух аргументов.
Возвращает первый аргумент, возведённый в степень второго аргумента.
Возвращает случайное число с плавающей запятой от 0 до 1. Может принимать необязательный seed (начальное значение), который может быть целочисленной константой или именем целочисленного атрибута.
Если вы используете seed, имейте в виду, что он сбрасывает начальную точку rand() отдельно для каждой обычной таблицы, RT-диска, RAM-чанка или псевдошарда. Поэтому запросы к распределённой таблице в любой форме могут возвращать несколько одинаковых случайных значений.
Возвращает синус аргумента.
Возвращает квадратный корень аргумента.
BM25A(k1,b) возвращает точное значение BM25A(). Требует использования ранкера expr и включенных index_field_lengths. Параметры k1 и b должны быть числами с плавающей точкой.
BM25F(k1, b, {field=weight, ...}) возвращает точное значение BM25F() и требует включения index_field_lengths. Также необходим ранкер expr. Параметры k1 и b должны быть числами с плавающей точкой.
Заменяет несуществующие столбцы значениями по умолчанию. Возвращает либо значение атрибута, указанного в 'attr-name', либо 'default-value', если этот атрибут не существует. Атрибуты STRING или MVA не поддерживаются. Эта функция полезна при поиске по нескольким таблицам с разными схемами.
SELECT *, EXIST('gid', 6) as cnd FROM i1, i2 WHERE cnd>5
Возвращает значение ключа сортировки худшего элемента в текущих top-N совпадениях, если ключ сортировки является числом с плавающей точкой, и 0 в противном случае.
Возвращает вес худшего элемента в текущих top-N совпадениях.
PACKEDFACTORS() может использоваться в запросах для отображения всех рассчитанных весовых коэффициентов при сопоставлении или для предоставления бинарного атрибута для создания пользовательской ранжирующей UDF. Эта функция работает только если указан ранкер выражений и запрос не является полным сканированием; в противном случае возвращается ошибка. PACKEDFACTORS() может принимать необязательный аргумент, отключающий расчет фактора ранжирования ATC: PACKEDFACTORS({no_atc=1}). Расчет ATC значительно замедляет обработку запроса, поэтому эта опция может быть полезна, если вам нужно увидеть факторы ранжирования, но ATC не требуется. PACKEDFACTORS() также может выводить данные в формате JSON: PACKEDFACTORS({json=1}). Соответствующие выводы в формате пар ключ-значение или JSON показаны ниже. (Обратите внимание, что примеры ниже перенесены для удобства чтения; фактические возвращаемые значения будут в одну строку.)
mysql> SELECT id, PACKEDFACTORS() FROM test1
-> WHERE MATCH('test one') OPTION ranker=expr('1') \G
*************************** 1\. row ***************************
id: 1
packedfactors(): bm25=569, bm25a=0.617197, field_mask=2, doc_word_count=2,
field1=(lcs=1, hit_count=2, word_count=2, tf_idf=0.152356,
min_idf=-0.062982, max_idf=0.215338, sum_idf=0.152356, min_hit_pos=4,
min_best_span_pos=4, exact_hit=0, max_window_hits=1, min_gaps=2,
exact_order=1, lccs=1, wlccs=0.215338, atc=-0.003974),
word0=(tf=1, idf=-0.062982),
word1=(tf=1, idf=0.215338)
1 row in set (0.00 sec)
mysql> SELECT id, PACKEDFACTORS({json=1}) FROM test1
-> WHERE MATCH('test one') OPTION ranker=expr('1') \G
*************************** 1\. row ***************************
id: 1
packedfactors({json=1}):
{
"bm25": 569,
"bm25a": 0.617197,
"field_mask": 2,
"doc_word_count": 2,
"fields": [
{
"lcs": 1,
"hit_count": 2,
"word_count": 2,
"tf_idf": 0.152356,
"min_idf": -0.062982,
"max_idf": 0.215338,
"sum_idf": 0.152356,
"min_hit_pos": 4,
"min_best_span_pos": 4,
"exact_hit": 0,
"max_window_hits": 1,
"min_gaps": 2,
"exact_order": 1,
"lccs": 1,
"wlccs": 0.215338,
"atc": -0.003974
}
],
"words": [
{
"tf": 1,
"idf": -0.062982
},
{
"tf": 1,
"idf": 0.215338
}
]
}
1 row in set (0.01 sec)
Эта функция может использоваться для реализации пользовательских функций ранжирования в UDF, как в:
SELECT *, CUSTOM_RANK(PACKEDFACTORS()) AS r
FROM my_index
WHERE match('hello')
ORDER BY r DESC
OPTION ranker=expr('1');
Где CUSTOM_RANK() — это функция, реализованная в UDF. Она должна объявлять структуру SPH_UDF_FACTORS (определена в sphinxudf.h), инициализировать эту структуру, распаковывать в нее факторы перед использованием и деинициализировать ее после использования, как показано ниже:
SPH_UDF_FACTORS factors;
sphinx_factors_init(&factors);
sphinx_factors_unpack((DWORD*)args->arg_values[0], &factors);
// ... can use the contents of factors variable here ...
sphinx_factors_deinit(&factors);
Данные PACKEDFACTORS() доступны на всех этапах запроса, а не только во время начального сопоставления и ранжирования. Это позволяет реализовать еще одно особенно интересное применение PACKEDFACTORS(): повторное ранжирование.
В примере выше мы использовали ранкер на основе выражений с фиктивным выражением и отсортировали результирующий набор по значению, вычисленному нашей UDF. Другими словами, мы использовали UDF для ранжирования всех наших результатов. Теперь, допустим для примера, что наша UDF чрезвычайно дорога в вычислении, с пропускной способностью всего 10 000 вызовов в секунду. Если наш запрос находит 1 000 000 документов, мы захотим использовать гораздо более простое выражение для выполнения большей части ранжирования, чтобы сохранить разумную производительность. Затем мы применим дорогую UDF только к нескольким лучшим результатам, скажем, к топ-100 результатам. Другими словами, мы построим топ-100 результатов с помощью более простой функции ранжирования, а затем переранжируем их с помощью более сложной. Это можно сделать с помощью подзапросов:
SELECT * FROM (
SELECT *, CUSTOM_RANK(PACKEDFACTORS()) AS r
FROM my_index WHERE match('hello')
OPTION ranker=expr('sum(lcs)*1000+bm25')
ORDER BY WEIGHT() DESC
LIMIT 100
) ORDER BY r DESC LIMIT 10
В этом примере ранкер на основе выражений вызывается для каждого найденного документа для вычисления WEIGHT(), поэтому он вызывается 1 000 000 раз. Однако вычисление UDF может быть отложено до внешней сортировки, и оно будет выполнено только для топ-100 совпадений по WEIGHT(), согласно внутреннему лимиту. Это означает, что UDF будет вызвана только 100 раз. Наконец, выбираются топ-10 совпадений по значению UDF и возвращаются приложению.
Для справки, в распределенной настройке данные PACKEDFACTORS() отправляются от агентов на главный узел в двоичном формате. Это технически позволяет реализовать дополнительные этапы повторного ранжирования на главном узле при необходимости.
При использовании в SQL, но не при вызове из каких-либо UDF, результат PACKEDFACTORS() форматируется как обычный текст, который можно использовать для ручной оценки факторов ранжирования. Обратите внимание, что эта функция в настоящее время не поддерживается API Manticore.
REMOVE_REPEATS ( result_set, column, offset, limit ) — удаляет повторяющиеся скорректированные строки с одинаковым значением 'column'.
SELECT REMOVE_REPEATS((SELECT * FROM dist1), gid, 0, 10)
Обратите внимание, что REMOVE_REPEATS не влияет на total_found в метаинформации поискового запроса.
Функция WEIGHT() возвращает рассчитанную оценку соответствия. Если порядок не указан, результат сортируется по убыванию оценки, предоставленной WEIGHT(). В этом примере мы сначала сортируем по весу, а затем по целочисленному атрибуту.
Приведенный выше поиск выполняет простое сопоставление, где все слова должны присутствовать. Однако мы можем сделать больше (и это всего лишь простой пример):
mysql> SELECT *,WEIGHT() FROM testrt WHERE MATCH('"list of business laptops"/3');
+------+------+-------------------------------------+---------------------------+----------+
| id | gid | title | content | weight() |
+------+------+-------------------------------------+---------------------------+----------+
| 1 | 10 | List of HP business laptops | Elitebook Probook | 2397 |
| 2 | 10 | List of Dell business laptops | Latitude Precision Vostro | 2397 |
| 3 | 20 | List of Dell gaming laptops | Inspirion Alienware | 2375 |
| 5 | 30 | List of ASUS ultrabooks and laptops | Zenbook Vivobook | 2375 |
+------+------+-------------------------------------+---------------------------+----------+
4 rows in set (0.00 sec)
mysql> SHOW META;
+----------------+----------+
| Variable_name | Value |
+----------------+----------+
| total | 4 |
| total_found | 4 |
| total_relation | eq |
| time | 0.000 |
| keyword[0] | list |
| docs[0] | 5 |
| hits[0] | 5 |
| keyword[1] | of |
| docs[1] | 4 |
| hits[1] | 4 |
| keyword[2] | business |
| docs[2] | 2 |
| hits[2] | 2 |
| keyword[3] | laptops |
| docs[3] | 5 |
| hits[3] | 5 |
+----------------+----------+
16 rows in set (0.00 sec)
Здесь мы ищем четыре слова, но совпадение может произойти, даже если найдены только три из четырех слов. Поиск будет ранжировать документы, содержащие все слова, выше.
Функция ZONESPANLIST() возвращает пары совпавших зонных интервалов. Каждая пара содержит идентификатор совпавшего зонного интервала, двоеточие и порядковый номер совпавшего зонного интервала. Например, если документ гласит <emphasis role="bold"><i>text</i> the <i>text</i></emphasis>, и вы запрашиваете 'ZONESPAN:(i,b) text', то ZONESPANLIST() вернет строку "1:1 1:2 2:1", означающую, что первый зонный интервал совпал с "text" в интервалах 1 и 2, а второй зонный интервал — только в интервале 1.
QUERY() возвращает текущий поисковый запрос. QUERY() является выражением пост-лимита и предназначена для использования с SNIPPET().
Функции таблиц являются механизмом обработки набора результатов после запроса. Функции таблиц принимают произвольный набор результатов в качестве входных данных и возвращают новый, обработанный набор в качестве выходных данных. Первый аргумент должен быть входным набором результатов, но функция таблицы может дополнительно принимать и обрабатывать больше аргументов. Функции таблиц могут полностью изменить набор результатов, включая схему. В настоящее время поддерживаются только встроенные функции таблиц. Функции таблиц работают как для внешнего SELECT, так и для вложенного SELECT.