# Manticore Search 4.0.2: full columnar store support, auto index compaction, locks system revamp, pseudo sharding

### Основные новые возможности
- **Полная поддержка [Manticore Columnar Library](https://github.com/manticoresoftware/columnar)**. Ранее Manticore Columnar Library поддерживалась только для обычных индексов. Теперь она поддерживается:
- в реальном времени индексах для `INSERT`, `REPLACE`, `DELETE`, `OPTIMIZE`
- в репликации
- в `ALTER`
- в `indextool --check`
- **Автоматическое сжатие индексов** ([\#478](https://github.com/manticoresoftware/manticoresearch/issues/478)). Наконец вам не нужно вызывать OPTIMIZE вручную или через cron‑задачу или иной тип автоматизации. Manticore теперь делает это за вас. Вы можете задать порог сжатия по умолчанию через [optimize_cutoff](https://manual.manticoresearch.com/Server_settings/Searchd#optimize_cutoff).
- **Снимки чанков и обновление системы блокировок**. Эти изменения могут быть незаметны снаружи на первый взгляд, но они значительно улучшают поведение многих процессов в реальных индексах. Кратко, ранее большинство операций манипуляции данными Manticore сильно зависели от блокировок, теперь мы используем снимки дисковых чанков. В частности:
    - операции чтения (например SELECT, репликация) выполняются со снимками
    - операции, которые лишь меняют внутреннюю структуру индекса без изменения схемы/документов (например слияние RAM‑сегментов, сохранение дисковых чанков, слияние дисковых чанков) выполняются с помощью снимков только для чтения и в конце заменяют существующие чанки
    - UPDATE и DELETE выполняются над существующими чанками, но в случае слияния, которое может происходить, записи собираются и затем применяются к новым чанкам
    - UPDATE последовательно захватывают эксклюзивную блокировку для каждого чанка. Слияния захватывают общую блокировку при переходе к этапу сбора атрибутов из чанка. Таким образом, одновременно только одна операция (слияние или обновление) имеет доступ к атрибутам чанка.
    - когда слияние доходит до фазы, требующей атрибутов, оно устанавливает специальный флаг. Когда UPDATE завершается, он проверяет флаг и, если он установлен, всё обновление сохраняется в специальной коллекции. Наконец, когда слияние завершается, оно применяет накопленные обновления к новому дисковому чанку.
    - ALTER выполняется через эксклюзивную блокировку
    - репликация работает как обычная операция чтения, но дополнительно сохраняет атрибуты перед SST и запрещает обновления во время SST
- **[ALTER](https://manual.manticoresearch.com/Updating_index_schema) может добавлять/удалять полнотекстовое поле**. Ранее он мог только добавлять/удалять атрибут.
- 🔬 **Экспериментально: псевдо-шардинг для запросов полного сканирования** — позволяет параллелить любой запрос, не являющийся полнотекстовым. Вместо ручной подготовки шардов теперь можно просто включить новую опцию [searchd.pseudo_sharding](https://manual.manticoresearch.com/Server_settings/Searchd#pseudo_sharding) и ожидать до `CPU cores` более низкое время отклика для не полнотекстовых запросов. Учтите, что он может легко занять все доступные ядра CPU, поэтому если вам важна не только задержка, но и пропускная способность — используйте его с осторожностью.



### Незначительные изменения
- Linux Mint и Ubuntu Hirsute Hippo поддерживаются через [APT repository](https://manual.manticoresearch.com/Installation/Debian_and_Ubuntu#APT-repository)
- более быстрая обновление по id через HTTP в больших индексах в некоторых случаях (зависит от распределения id)
- [custom startup flags for systemd](https://manual.manticoresearch.com/Starting_the_server/Linux#Custom-startup-flags-using-systemd). Теперь вам не нужно запускать searchd вручную, если требуется запустить Manticore с определённым флагом запуска
- новая функция [LEVENSHTEIN()](https://manual.manticoresearch.com/Functions/String_functions#LEVENSHTEIN%28%29), вычисляющая расстояние Левенштейна
- добавлены новые [searchd startup flags](https://manual.manticoresearch.com/Starting_the_server/Manually#searchd-command-line-options) `--replay-flags=ignore-trx-errors` и `--replay-flags=ignore-all-errors`, чтобы можно было запустить searchd даже если binlog повреждён
- [\#621](https://github.com/manticoresoftware/manticoresearch/issues/621) — раскрыть ошибки из RE2
- более точный [COUNT(DISTINCT)](https://manual.manticoresearch.com/Searching/Grouping#COUNT%28DISTINCT-field%29) для распределённых индексов, состоящих из локальных обычных индексов
- [FACET DISTINCT](https://manual.manticoresearch.com/Searching/Faceted_search#Faceting-without-duplicates) для удаления дубликатов при фасетном поиске
- [exact form modified](https://manual.manticoresearch.com/Searching/Full_text_matching/Operators#Exact-form-modifier) теперь не требует [morphology](https://manual.manticoresearch.com/Creating_a_table/NLP_and_tokenization/Morphology#morphology) и работает для индексов с включённым поиском [infix/prefix](https://manual.manticoresearch.com/Creating_a_table/NLP_and_tokenization/Wildcard_searching_settings#Wildcard-searching-settings)



### Ломающие изменения
- новая версия может читать старые индексы, но старые версии не могут читать индексы Manticore 4
- удалена неявная сортировка по id. Сортируйте явно, если это необходимо
- значение по умолчанию для `charset_table` изменяется с `0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451` на `non_cjk`
- `OPTIMIZE` происходит автоматически. Если вам это не нужно, убедитесь, что установили `auto_optimize=0` в разделе `searchd` в конфигурационном файле
- [\#616](https://github.com/manticoresoftware/manticoresearch/issues/616) `ondisk_attrs_default` были устаревшими, теперь они удалены
- для участников: теперь мы используем компилятор Clang для сборок под Linux, так как по нашим тестам он может собрать более быструю Manticore Search и Manticore Columnar Library
- если [max\_matches](https://manual.manticoresearch.com/Searching/Options#max_matches) не указан в поисковом запросе, он обновляется неявно с наименьшим необходимым значением ради производительности нового колонного хранилища. Это может повлиять на метрику `total` в [SHOW META](https://manual.manticoresearch.com/Profiling_and_monitoring/SHOW_META#SHOW-META), но не на `total_found`, который является фактическим количеством найденных документов.



### Миграция с Manticore 3
- убедитесь, что вы остановили Manticore 3 корректно:
- в `/var/lib/manticore/binlog/` не должно быть файлов binlog (только `binlog.meta` должен находиться в директории)
- в противном случае индексы, для которых Manticore 4 не может воспроизвести binlogs, не будут запущены
- новая версия может читать старые индексы, но старые версии не могут читать индексы Manticore 4, поэтому убедитесь, что сделали резервную копию, если хотите легко откатить новую версию
- если вы запускаете кластер репликации, убедитесь, что вы:
- сначала корректно остановили все ваши узлы
- а затем запустили узел, который был остановлен последним, с `--new-cluster` (запустите инструмент `manticore_new_cluster` в Linux).
- прочитайте о [перезапуске кластера](https://manual.manticoresearch.com/Creating_a_cluster/Setting_up_replication/Restarting_a_cluster#Restarting-a-cluster) для получения дополнительных деталей



### Исправления ошибок
- Исправлено множество проблем с репликацией:
- [696f8649](https://github.com/manticoresoftware/manticoresearch/commit/696f8649535f2b5285b878c9581c0d2b1139ae09) - исправлен сбой во время SST на joiner с активным индексом; добавлена проверка sha1 на узле joiner при записи файловых частей для ускорения загрузки индекса; добавлена ротация измененных файлов индекса на узле joiner при загрузке индекса; добавлено удаление файлов индекса на узле joiner, когда активный индекс заменяется новым индексом с узла донора; добавлены точки журнала репликации на узле донора для отправки файлов и частей
- [b296c55a](https://github.com/manticoresoftware/manticoresearch/commit/b296c55af68314a8fc66f8b104e7301d673c3b68) - сбой на JOIN CLUSTER в случае неправильного адреса
- [418bf880](https://github.com/manticoresoftware/manticoresearch/commit/418bf880a5e05ffbb68f311a1c23006a9df3220e) - во время первоначальной репликации большого индекса узел joiner мог завершиться с `ERROR 1064 (42000): invalid GTID, (null)`, узел донора мог стать неотзывчивым, пока другой узел присоединялся
- [6fd350d2](https://github.com/manticoresoftware/manticoresearch/commit/6fd350d28e4905211cf8a7298cbf7cdda101c83d) - хеш мог быть рассчитан неправильно для большого индекса, что могло привести к сбою репликации
- [\#615](https://github.com/manticoresoftware/manticoresearch/issues/615) - репликация не удалась при перезапуске кластера
- [\#574](https://github.com/manticoresoftware/manticoresearch/issues/574) - `indextool --help` не отображает параметр `--rotate`
- [\#578](https://github.com/manticoresoftware/manticoresearch/issues/578) - высокая загрузка CPU у searchd в режиме ожидания после примерно одного дня
- [\#587](https://github.com/manticoresoftware/manticoresearch/issues/587) - немедленный сброс .meta
- [\#617](https://github.com/manticoresoftware/manticoresearch/issues/617) - manticore.json очищается
- [\#618](https://github.com/manticoresoftware/manticoresearch/issues/618) - searchd --stopwait не работает под root. Это также исправляет поведение systemctl (ранее он показывал сбой для ExecStop и не ждал достаточно долго, чтобы searchd остановился корректно)
- [\#619](https://github.com/manticoresoftware/manticoresearch/issues/619) - INSERT/REPLACE/DELETE против SHOW STATUS. `command_insert`, `command_replace` и другие показывали неправильные метрики
- [\#620](https://github.com/manticoresoftware/manticoresearch/issues/620) - `charset_table` для простого индекса имел неправильное значение по умолчанию
- [8f753688](https://github.com/manticoresoftware/manticoresearch/commit/8f7536887d4b58a5bab5647fc067b2d0482c2038) - новые дисковые части не блокируются
- [\#607](https://github.com/manticoresoftware/manticoresearch/issues/607) - узел кластера Manticore выдает сбой, когда не может разрешить узел по имени
- [\#623](https://github.com/manticoresoftware/manticoresearch/issues/623) - репликация обновленного индекса может привести к неопределенному состоянию
- [ca03d228](https://github.com/manticoresoftware/manticoresearch/commit/ca03d2280c5197e9b311f0f03f551e3b702a8130) - индексатор мог зависнуть при индексации источника простого индекса с атрибутом json
- [53c75305](https://github.com/manticoresoftware/manticoresearch/commit/53c753054558ff3f82c7af365273d32537c5338b) - исправлено выражение фильтра "не равно" в индексе PQ
- [ccf94e02](https://github.com/manticoresoftware/manticoresearch/commit/ccf94e022ba6763d6286ab5bac767b6f6a846846) - исправлены выборки окон в запросах списка выше 1000 совпадений. `SELECT * FROM pq ORDER BY id desc LIMIT 1000 , 100 OPTION max_matches=1100` ранее не работал
- [a0483fe9](https://github.com/manticoresoftware/manticoresearch/commit/a0483fe9bef3c45dffe96f5df4f4382aee29c072) - HTTPS-запрос к Manticore мог вызвать предупреждение "max packet size(8388608) exceeded"
