Как стать автором
Обновить

Manticore Search 7.0.0: fuzzy search, автодополнение, Kafka, JSON индексы, Jieba, лёгкая пагинация

Время на прочтение4 мин
Количество просмотров922

Мы представляем Manticore Search 7.0.0 — новую версию с интересными функциональными улучшениями, оптимизациями производительности и критическими обновлениями для повышения стабильности. Среди ключевых изменений — поддержка нечёткого поиска, автодополнения, интеграция с Kafka, новая сегментация китайского.

🚨 Важная информация перед обновлением


Перед переходом на новую версию обратите внимание на следующие изменения:

  • Бинарные логи для отдельных таблиц (#879): Перед обновлением выполните полную остановку сервиса, так как формат бинарных логов изменился.

  • Обновления протокола репликации (#1789, #2308): Если используете репликацию, то следуйте инструкциям по перезапуску кластера.

  • Обновление в протоколе Master/agent (#2468): Если используете распределённые таблицы, то сначала обновите агенты, затем мастер-узлы.

Полный список изменений доступен в changelog'е.

🔍 Нечеткий поиск и автодополнение

Прощайте, опечатки! Новая функция Fuzzy Search находит похожие термины, даже если запрос содержит ошибки, учитывает раскладки клавиатуры и легко включает. А Autocomplete предсказывает поисковые фразы в реальном времени.

mysql> SELECT * FROM mytable WHERE MATCH('someting') OPTION fuzzy=1, layouts='us,ua', distance=2;
+------+-------------+
| id   | content     |
+------+-------------+
|    1 | something   |
|    2 | some thing  |
+------+-------------+
2 rows in set (0.00 sec)
mysql> call autocomplete('gra', 'test');
+-----------+
| query     |
+-----------+
| gradually |
| grow      |
| grew      |
| angry     |
| draw      |
| hungry    |
| brave     |
+-----------+

Обе новые функции также доступны через JSON-интерфейс.

📜 Постраничная навигация с помощью Scroll

Пагинация стала проще и быстрее за счёт новой опции поиска Scroll:

  • SHOW SCROLL после селекта даёт токен, указывающий на то, где закончилась пагинация

  • option scroll='<токен>' в следующем селекте позволяет продолжить со следующего документа

SELECT weight(), id FROM test WHERE match('hello') ORDER BY weight() desc, id asc limit 2;

SHOW SCROLL;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| scroll_token                                                                                                                                                                                                             |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| eyJvcmRlcl9ieV9zdHIiOiJ3ZWlnaHQoKSBkZXNjLCBpZCBhc2MiLCJvcmRlcl9ieSI6W3siYXR0ciI6IndlaWdodCgpIiwiZGVzYyI6dHJ1ZSwidmFsdWUiOjEyODEsInR5cGUiOiJpbnQifSx7ImF0dHIiOiJpZCIsImRlc2MiOmZhbHNlLCJ2YWx1ZSI6MiwidHlwZSI6ImludCJ9XX0= |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


SELECT weight(), id FROM test WHERE match('hello') limit 20
OPTION scroll='eyJvcmRlcl9ieV9zdHIiOiJ3ZWlnaHQoKSBkZXNjLCBpZCBhc2MiLCJvcmRlcl9ieSI6W3siYXR0ciI6IndlaWdodCgpIiwiZGVzYyI6dHJ1ZSwidmFsdWUiOjEyODEsInR5cGUiOiJpbnQifSx7ImF0dHIiOiJpZCIsImRlc2MiOmZhbHNlLCJ2YWx1ZSI6MiwidHlwZSI6ImludCJ9XX0=';

⚡ Синхронизация с Кафкой в реальном времени

Интегрируйте потоковые данные из Kafka напрямую в Manticore для поиска по логам, метрикам или пользовательскому контенту.

CREATE SOURCE kafka
(id bigint, term text, abbrev '$abbrev' text, GlossDef json)
type='kafka'
broker_list='kafka:9092'
topic_list='my-data'
consumer_group='manticore'
num_consumers='2'
batch=50

CREATE TABLE destination_kafka
(id bigint, name text, short_name text, received_at text, size multi);

CREATE MATERIALIZED VIEW view_table
TO destination_kafka AS
SELECT id, term as name, abbrev as short_name, UTC_TIMESTAMP() as received_at, GlossDef.size as size FROM kafka

📊 Производительность: Вторичные индексы для JSON

Фильтрация по атрибутам JSON стала быстрее с помощью вторичных индексов.

ALTER TABLE users ADD COLUMN profile JSON;
ALTER TABLE users ADD secondary_index profile_json ON (profile);

Также добавлена новая команда SHOW TABLE INDEXES для отображения вторичных индексов в таблице:

mysql> SHOW TABLE test INDEXES;
+------------------------------+--------+---------+---------+
| Name                         | Type   | Enabled | Percent |
+------------------------------+--------+---------+---------+
| j['addresses']               | uint32 | 1       | 100     |
| j['addresses']['a1']         | uint32 | 1       | 100     |
| j['addresses']['a2']         | uint32 | 1       | 100     |
| j['factor']                  | uint32 | 1       | 100     |
| j['int_arr']                 | uint32 | 1       | 100     |
| j['tags']                    | uint32 | 1       | 100     |
| id                           | int64  | 1       | 100     |
| j['price']                   | float  | 1       | 100     |
| j['addresses']['a1']['id']   | string | 1       | 100     |
| j['addresses']['a1']['name'] | string | 1       | 100     |
| j['addresses']['a2']['id']   | string | 1       | 100     |
| j['addresses']['a2']['name'] | string | 1       | 100     |
| j['arr']                     | string | 1       | 100     |
| j['str']                     | string | 1       | 100     |
| j['tags']['1']               | string | 1       | 100     |
| j['tags']['2']               | string | 1       | 100     |
+------------------------------+--------+---------+---------+
16 rows in set (0.00 sec)

📊 Производительность: Неблокирующие UPDATE'ы и слияния


Операции обновления и поиска больше не прерываются при слиянии дисковых чанков.

📊 Производительность: Автоматическая очистка дисковых чанков для RT-таблиц


Manticore теперь автоматически сохраняет RAM-чанки на диск при первой возможности, предотвращая снижение производительности (RAM-чанки не смотря на то, что находятся в памяти могут работать медленнее дисковых чанков при некоторых обстоятельствах). Настройка diskchunk_flush_write_timeout позволяет управлять этим процессом.

🌍 Китайская токенизация с Jieba (#931)


Можно точнее сегментировать китайские тексты с помощью функций и словаря библиотеки Jieba.

CREATE TABLE products(title text, price float) charset_table = 'cont' morphology = 'jieba_chinese'

И многое другое


В Manticore 7.0.0 также вошли:

  • 🚀 7 ключевых изменений

  • ✅ 49 второстепенных улучшений

  • 🐞 63 исправлениями ошибок

Полный список — в changelog.

Особая благодарность участникам @sibnix, @animetosho, Алексею Иванову и всем, кто помог в создании этого релиза! ❤️

Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+7
Комментарии0

Другие новости

Истории

Работа

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область