При работе с шардированными таблицами учитывайте следующие ограничения:
-
Локальные и кластерные шардированные таблицы не могут сосуществовать на одних и тех же узлах: На наборе узлов, входящих в кластер репликации, нельзя смешивать:
- Локальные шардированные таблицы (созданные без префикса кластера:
create table s ... shards='N' rf='1') - Кластерные шардированные таблицы (созданные с префиксом кластера:
create table c:r ... shards='N' rf='M')
Пример: рассмотрим кластер из 2 узлов, где:
- Таблица
sбыла создана независимо на каждом узле как локальная шардированная таблица - Таблица
rреплицируется на оба узла через кластер
В этой конфигурации попытка создать кластерную шардированную таблицу (
create table c:r ... shards='N' rf='2') на тех же узлах завершится ошибкой. - Локальные шардированные таблицы (созданные без префикса кластера:
-
Согласованность имени кластера:
- Подсистема шардирования при первом использовании привязывается к одному имени кластера; все кластерные шардированные таблицы на этих узлах должны использовать это же имя кластера.
- После выбора имени кластера оно применяется ко всем последующим созданиям кластерных шардированных таблиц.
Пример: если первую кластерную шардированную таблицу вы создаете так:
create table c:users ... shards='N' rf='M'Все последующие кластерные шардированные таблицы должны использовать кластер
c:create table c:orders ... shards='N' rf='M' -- works create table d:items ... shards='N' rf='M' -- fails -
Изменение таблиц не поддерживается:
- После создания шардированной таблицы ее структуру нельзя изменить с помощью
ALTER TABLE. - Чтобы изменить схему, нужно:
- Создать новую шардированную таблицу с нужной структурой
- Скопировать данные в новую таблицу
- Удалить старую таблицу
- После создания шардированной таблицы ее структуру нельзя изменить с помощью
-
Ограничение на число шардов:
- Не более 3,000 шардов на одну шардированную таблицу.
- Это ограничение действует независимо от конфигурации кластера и размера таблицы.
- Планируйте стратегию шардирования с учетом этого лимита.
-
rfиshardsдолжны быть целыми числами в кавычках:- Оба параметра требуют заключенного в кавычки числового значения (
shards='10',rf='2'); значения без кавычек, нечисловые, пустые или дробные значения отклоняются. - На автономном (не кластерном) сервере
rfдолжен быть равен'1'. - В кластере репликации
rfдолжен быть от1до числа узлов в кластере.
- Оба параметра требуют заключенного в кавычки числового значения (
Manticore Search имеет одноуровневую иерархию для таблиц.
В отличие от других СУБД, в Manticore нет концепции группировки таблиц в базы данных. Однако для совместимости с диалектами SQL, Manticore принимает операторы SHOW DATABASES для совместимости с диалектом SQL, но оператор не возвращает никаких результатов.
Общий синтаксис:
SHOW TABLES [ LIKE pattern ]
Оператор SHOW TABLES выводит список всех активных в данный момент таблиц вместе с их типами. Существующие типы таблиц: local, distributed, rt, percolate и template.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
SHOW TABLES;POST /sql?mode=raw -d "SHOW TABLES"$client->nodes()->table();utilsApi.sql('SHOW TABLES')await utilsApi.sql('SHOW TABLES')res = await utilsApi.sql('SHOW TABLES');utilsApi.sql("SHOW TABLES", true)utilsApi.Sql("SHOW TABLES", true)utils_api.sql("SHOW TABLES", Some(true)).await+----------+-------------+
| Таблица | Тип |
+----------+-------------+
| dist | distributed |
| plain | local |
| pq | percolate |
| rt | rt |
| template | template |
+----------+-------------+
5 rows in set (0.00 sec)[
{
"columns": [
{
"Table": {
"type": "string"
}
},
{
"Type": {
"type": "string"
}
}
],
"data": [
{
"Table": "dist",
"Type": "distributed"
},
{
"Table": "plain",
"Type": "local"
},
{
"Table": "pq",
"Type": "percolate"
},{
"Table": "rt",
"Type": "rt"
},{
"Table": "template",
"Type": "template"
}
],
"total": 5,
"error": "",
"warning": ""
}
]Array
(
[dist1] => distributed
[rt] => rt
[products] => rt
){u'columns': [{u'Table': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'dist1', u'Type': u'distributed'},
{u'Index': u'rt', u'Type': u'rt'},
{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'dist1', u'Type': u'distributed'},
{u'Index': u'rt', u'Type': u'rt'},
{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{"columns":[{"Index":{"type":"string"}},{"Type":{"type":"string"}}],"data":[{"Index":"products","Type":"rt"}],"total":0,"error":"","warning":""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error=, warning=}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}Поддерживается необязательное предложение LIKE для фильтрации таблиц по имени.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
SHOW TABLES LIKE 'pro%';POST /sql?mode=raw -d "SHOW TABLES LIKE 'pro%';"$client->nodes()->table(['body'=>['pattern'=>'pro%']]);utilsApi.sql('SHOW TABLES LIKE \'pro%\'');await utilsApi.sql('SHOW TABLES LIKE \'pro%\'');utilsApi.sql('SHOW TABLES LIKE \'pro%\'')utilsApi.sql("SHOW TABLES LIKE 'pro%'", true)utilsApi.Sql("SHOW TABLES LIKE 'pro%'", true)utils_api.sql("SHOW TABLES LIKE 'pro%'", Some(true)).await+----------+-------------+
| Index | Type |
+----------+-------------+
| products | distributed |
+----------+-------------+
1 row in set (0.00 sec)[
{
"columns": [
{
"Table": {
"type": "string"
}
},
{
"Type": {
"type": "string"
}
}
],
"data": [
{
"Table": "products",
"Type": "distributed"
}
],
"total": 1,
"error": "",
"warning": ""
}
]Array
(
[products] => distributed
){u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{u'columns': [{u'Index': {u'type': u'string'}},
{u'Type': {u'type': u'string'}}],
u'data': [{u'Index': u'products', u'Type': u'rt'}],
u'error': u'',
u'total': 0,
u'warning': u''}{"columns":[{"Index":{"type":"string"}},{"Type":{"type":"string"}}],"data":[{"Index":"products","Type":"rt"}],"total":0,"error":"","warning":""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error=, warning=}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{columns=[{Index={type=string}}, {Type={type=string}}], data=[{Index=products, Type=rt}], total=0, error="", warning=""}{DESC | DESCRIBE} table_name [ LIKE pattern ]
Оператор DESCRIBE выводит столбцы таблицы и их связанные типы. Столбцы включают ID документа, полнотекстовые поля и атрибуты. Порядок соответствует тому, в котором поля и атрибуты ожидаются операторами INSERT и REPLACE. Типы столбцов включают field, integer, timestamp, ordinal, bool, float, bigint, uuid, string и mva. Столбец ID по умолчанию имеет тип bigint, а для таблицы реального времени, объявленной с id uuid, используется uuid. Пример:
mysql> DESC rt;
+---------+---------+
| Field | Type |
+---------+---------+
| id | bigint |
| title | field |
| content | field |
| gid | integer |
+---------+---------+
4 rows in set (0.00 sec)
Поддерживается необязательное предложение LIKE. Подробности о его синтаксисе см. в разделе SHOW META.
Вы также можете просмотреть схему таблицы, выполнив запрос select * from <table_name>.@table. Преимущество этого метода в том, что вы можете использовать предложение WHERE для фильтрации:
- SQL
- JSON
select * from tbl.@table where type='text';POST /sql?mode=raw -d "select * from tbl.@table where type='text';"+------+-------+------+----------------+
| id | field | type | properties |
+------+-------+------+----------------+
| 2 | title | text | indexed stored |
+------+-------+------+----------------+
1 row in set (0.00 sec)[{
"columns":[{"id":{"type":"long long"}},{"field":{"type":"string"}},{"type":{"type":"string"}},{"properties":{"type":"string"}}],
"data":[
{"id":2,"field":"title","type":"text","properties":"indexed stored"}
],
"total":1,
"error":"",
"warning":""
}]Вы также можете выполнять множество других действий с <your_table_name>.@table, рассматривая его как обычную таблицу Manticore со столбцами, состоящими из целочисленных и строковых атрибутов.
- SQL
select field from tbl.@table;
select field, properties from tbl.@table where type in ('text', 'uint');
select * from tbl.@table where properties any ('stored');SHOW CREATE TABLE table_name [ OPTION output_words = 'list' | 'file' ]
Выводит оператор CREATE TABLE, использованный для создания указанной таблицы.
Если таблица была создана с помощью SQL-ярлыка profile=..., SHOW CREATE TABLE выводит развернутые настройки вместо самого имени профиля.
Опция output_words позволяет управлять отображением настроек внешних файлов (таких как stopwords, exceptions, wordforms, hitless_words):
'list'(по умолчанию): Отображает содержимое файлов в виде встроенных списков с использованием опций*_list(например,stopwords_list='word1; word2').'file': Отображает пути к файлам с использованием исходных опций (например,stopwords='/path/to/file').
- SQL
- JSON
SHOW CREATE TABLE tbl\GPOST /sql?mode=raw -d "SHOW CREATE TABLE tbl" Table: tbl
Create Table: CREATE TABLE tbl (
f text indexed stored
) charset_table='non_cont,cont' morphology='icu_chinese'
1 row in set (0.00 sec)[{
"columns":[{"Table":{"type":"string"}},{"Create Table":{"type":"string"}}],
"data":[
{"Table":"tbl","Create Table":"CREATE TABLE tbl (\nf text)"}
],
"total":1,
"error":"",
"warning":""
}]Если вы используете оператор DESC для перколяционной таблицы, он отобразит внешнюю схему таблицы, которая является схемой хранимых запросов. Эта схема статична и одинакова для всех локальных перколяционных таблиц:
mysql> DESC pq;
+---------+--------+
| Field | Type |
+---------+--------+
| id | bigint |
| query | string |
| tags | string |
| filters | string |
+---------+--------+
4 rows in set (0.00 sec)
Если вы хотите просмотреть ожидаемую схему документа, используйте следующую команду:
DESC <pq table name> table:
mysql> DESC pq TABLE;
+-------+--------+
| Field | Type |
+-------+--------+
| id | bigint |
| title | text |
| gid | uint |
+-------+--------+
3 rows in set (0.00 sec)
Также поддерживается desc pq table like ..., и он работает следующим образом:
mysql> desc pq table like '%title%';
+-------+------+----------------+
| Field | Type | Properties |
+-------+------+----------------+
| title | text | indexed stored |
+-------+------+----------------+
1 row in set (0.00 sec)
Удаление таблицы выполняется внутренне в 2 шага:
- Таблица очищается (аналогично TRUNCATE)
- Все файлы таблицы удаляются из папки таблицы. Все внешние файлы таблицы, которые использовались таблицей (такие как wordforms, extensions или stopwords), также удаляются. Обратите внимание, что эти внешние файлы копируются в папку таблицы при использовании
CREATE TABLE, поэтому исходные файлы, указанные вCREATE TABLE, не будут удалены.
Удаление таблицы возможно только когда сервер работает в режиме RT. Можно удалить RT таблицы, PQ таблицы и распределённые таблицы.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
DROP TABLE products;POST /cli -d "DROP TABLE products"$params = [ 'table' => 'products' ];
$response = $client->indices()->drop($params);utilsApi.sql('DROP TABLE products')await utilsApi.sql('DROP TABLE products')res = await utilsApi.sql('DROP TABLE products');sqlresult = utilsApi.sql("DROP TABLE products", true);sqlresult = utilsApi.Sql("DROP TABLE products", true);let sqlresult = utils_api.sql("DROP TABLE products", Some(true)).await;Query OK, 0 rows affected (0.02 sec){
"total":0,
"error":"",
"warning":""
}Array
(
[total] => 0
[error] =>
[warning] =>
){u'error': u'', u'total': 0, u'warning': u''}{u'error': u'', u'total': 0, u'warning': u''}{"total":0,"error":"","warning":""}{total=0, error=, warning=}{total=0, error="", warning=""}{total=0, error="", warning=""}Синтаксис оператора DROP TABLE в SQL выглядит следующим образом:
DROP TABLE [IF EXISTS] table_name
При удалении таблицы через SQL можно использовать добавление IF EXISTS, чтобы удалить таблицу только если она существует. Если вы попробуете удалить несуществующую таблицу с опцией IF EXISTS, ничего не произойдёт.
При удалении таблицы через PHP можно добавить необязательный параметр silent, который работает так же, как IF EXISTS.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
DROP TABLE IF EXISTS products;POST /cli -d "DROP TABLE IF EXISTS products"$params =
[
'table' => 'products',
'body' => ['silent' => true]
];
$client->indices()->drop($params);utilsApi.sql('DROP TABLE IF EXISTS products')await utilsApi.sql('DROP TABLE IF EXISTS products')res = await utilsApi.sql('DROP TABLE IF EXISTS products');sqlresult = utilsApi.sql("DROP TABLE IF EXISTS products", true);sqlresult = utilsApi.Sql("DROP TABLE IF EXISTS products", true);let sqlresult = utils_api.sql("DROP TABLE IF EXISTS products", Some(true)).await;{u'error': u'', u'total': 0, u'warning': u''}{u'error': u'', u'total': 0, u'warning': u''}{"total":0,"error":"","warning":""}{total=0, error=, warning=}{total=0, error="", warning=""}{total=0, error="", warning=""}Таблицу можно очистить с помощью SQL-запроса TRUNCATE TABLE или функции клиента PHP truncate().
Вот синтаксис для SQL-запроса:
TRUNCATE TABLE table_name [WITH RECONFIGURE]
При выполнении этого запроса RT или распределённая таблица полностью очищается. Данные в памяти удаляются, все файлы данных таблицы разрываются, и освобождаются связанные бинарные логи.
Для очистки распределённой таблицы используйте синтаксис без опции with reconfigure. Просто выполните стандартный запрос TRUNCATE для вашей распределённой таблицы.
TRUNCATE TABLE distributed_table
ПРИМЕЧАНИЕ. Очистка распределённой таблицы требует Manticore Buddy. Если это не работает, убедитесь, что Buddy установлен.
Таблицу также можно очистить с помощью DELETE FROM index WHERE id>0, но это не рекомендуется, так как работает медленнее, чем TRUNCATE.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
TRUNCATE TABLE products;POST /cli -d "TRUNCATE TABLE products"$params = [ 'table' => 'products' ];
$response = $client->indices()->truncate($params);utilsApi.sql('TRUNCATE TABLE products')await utilsApi.sql('TRUNCATE TABLE products')res = await utilsApi.sql('TRUNCATE TABLE products');utilsApi.sql("TRUNCATE TABLE products", true);utilsApi.Sql("TRUNCATE TABLE products", true);utils_api.sql("TRUNCATE TABLE products", Some(true)).await;Query OK, 0 rows affected (0.02 sec){
"total":0,
"error":"",
"warning":""
}Array(
[total] => 0
[error] =>
[warning] =>
){u'error': u'', u'total': 0, u'warning': u''}{u'error': u'', u'total': 0, u'warning': u''}{"total":0,"error":"","warning":""}{total=0, error=, warning=}{total=0, error="", warning=""}{total=0, error="", warning=""}Одно из возможных применений этой команды — перед присоединением таблицы.
Когда используется опция RECONFIGURE, новые настройки токенизации, морфологии и другие параметры обработки текста, заданные в конфигурации, вступают в силу после очистки таблицы. В случае если описание схемы в конфигурации отличается от схемы таблицы, новая схема из конфигурации применяется после очистки таблицы.
ПРИМЕЧАНИЕ. Опция
RECONFIGUREимеет смысл только в Plain mode, где применяются настройки из конфигурационного файла. Обратите внимание, чтоTRUNCATEподдерживается только для RT таблиц, а опцияRECONFIGUREможет использоваться с RT таблицами только в Plain mode.
С этой опцией очистка и перенастройка таблицы становятся одной атомарной операцией.
- SQL
- HTTP
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
TRUNCATE TABLE products with reconfigure;POST /cli -d "TRUNCATE TABLE products with reconfigure"$params = [ 'table' => 'products', 'with' => 'reconfigure' ];
$response = $client->indices()->truncate($params);utilsApi.sql('TRUNCATE TABLE products WITH RECONFIGURE')await utilsApi.sql('TRUNCATE TABLE products WITH RECONFIGURE')res = await utilsApi.sql('TRUNCATE TABLE products WITH RECONFIGURE');utilsApi.sql("TRUNCATE TABLE products WITH RECONFIGURE", true);utilsApi.Sql("TRUNCATE TABLE products WITH RECONFIGURE" ,true);utils_api.sql("TRUNCATE TABLE products WITH RECONFIGURE", Some(true)).await;Query OK, 0 rows affected (0.02 sec){
"total":0,
"error":"",
"warning":""
}Array(
[total] => 0
[error] =>
[warning] =>
){u'error': u'', u'total': 0, u'warning': u''}{u'error': u'', u'total': 0, u'warning': u''}{"total":0,"error":"","warning":""}{total=0, error=, warning=}{total=0, error="", warning=""}