- BrainTools - https://www.braintools.ru -

Manticore Search 29.9.0: chunked auto-embeddings и mmap-доступ к columnar-атрибутам

Manticore Search 29.9.0: chunked auto-embeddings и mmap-доступ к columnar-атрибутам

Manticore Search 29.9.0: chunked auto-embeddings и mmap-доступ к columnar-атрибутам

Manticore Search 29.9.0: chunked auto-embeddings и mmap-доступ к columnar-атрибутам

Manticore Search 29.9.0 добавляет chunked и multi-vector auto-embeddings, ограничение входа для embedding-моделей, UTF-8 идентификаторы, mmap-доступ к columnar-атрибутам по умолчанию, а также исправления для hybrid search, KNN, bulk ingestion и группировки.

Вышел [Manticore Search 29.9.0](https://mnt.cr/go/6d9yh8 [1] Главное изменение относится к auto-embeddings: длинные документы теперь можно разбивать на фрагменты, а один документ может хранить несколько векторов вместо того, чтобы сжимать всё содержимое в один. В релизе также mmap стал режимом доступа к columnar-атрибутам по умолчанию, появились более безопасные настройки для embedding-нагрузок, UTF-8 идентификаторы, улучшения backup и исправления в hybrid search, KNN, bulk ingestion, grouped search и изменениях схемы.

Этот пост покрывает всё, что вышло после 29.0.2, с 29.0.3 по 29.9.0.

Спасибо [@tudorvasinca [2]](https://mnt.cr/go/TIds5B [3] за работу над [PR #4857](https://mnt.cr/go/B1SXr5 [4], [PR #4859](https://mnt.cr/go/O0eEjC [5] и [PR #4873](https://mnt.cr/go/drbfcB [6]


Что учесть при обновлении

Обязательной миграции данных на уровне всего релиза нет. Существующие таблицы и конфигурацию можно обновлять обычным образом, но некоторые исправления требуют дополнительных действий, если старое поведение [7] уже повлияло на данные:

  • Нормализация немецкого sharp-s включается явно. Если переключить существующую таблицу на lemmatize_de_v2 или lemmatize_de_v2_all, индексируемые термы изменятся, поэтому plain-таблицу нужно перестроить, а документы в RT-таблицу — переиграть заново.

  • Для authenticated BACKUP появилось действие авторизации backup. Перед downgrade до 29.3.12 или более ранней версии нужно удалить все backup grants.

  • Columnar-атрибуты теперь используют mmap по умолчанию вместо buffered file reads. Если нужен прежний режим доступа, задайте access_columnar_attrs='file' явно.


Длинные документы могут хранить больше одного embedding

Старый путь auto-embedding создавал один вектор на документ и обрезал текст, который не помещался в окно входа модели. Для заголовков и коротких описаний это работает, но релевантный абзац ближе к концу длинной статьи мог вообще не попасть в индекс.

Manticore Search теперь поддерживает пять [стратегий разбиения на chunks](https://mnt.cr/go/fCxeBG [8]

  • truncate сохраняет прежнее поведение [9] и остаётся стратегией по умолчанию.

  • mean строит embedding для каждого chunk и усредняет результаты в один вектор.

  • fixed разбивает текст на окна фиксированного размера в токенах.

  • recursive предпочитает границы абзацев, строк, предложений и пробелов именно в таком порядке.

  • sentence группирует полные предложения до заданного лимита.

Multi-vector стратегии используют [float_vector_array](https://mnt.cr/go/UuFwcw [10] Каждый chunk участвует в KNN-поиске независимо, но Manticore возвращает документ один раз и использует ближайший chunk для knn_dist():

CREATE TABLE articles (
  title text,
  content text,
  chunks float_vector_array knn_type='hnsw' hnsw_similarity='cosine'
    model_name='Xenova/all-MiniLM-L6-v2' from='title,content'
    chunk_strategy='sentence' max_tokens='256' overlap_tokens='32'
);

INSERT INTO articles (id, title, content)
VALUES (1, 'Rotating certificates', 'A long guide with many sections ...');

SELECT id, knn_dist()
FROM articles
WHERE knn(chunks, 5, 'how do I rotate a certificate');

MAX_TOKENS, OVERLAP_TOKENS и MAX_CHUNKS управляют размером chunk, общим контекстом на границах и максимальным количеством векторов. Model-backed float_vector_array нужно объявлять при создании таблицы: добавить его позже через ALTER TABLE ... ADD COLUMN и перестроить embeddings пока нельзя.

Ограничение локальной embedding-нагрузки

Модели с длинным контекстом могут сделать один большой вход неожиданно дорогим, особенно на CPU. Новая опция колонки [MAX_INPUT_TOKENS](https://mnt.cr/go/zZvLPe [11] ограничивает объём каждого входа, который отправляется в локальную embedding-модель:

ALTER TABLE articles
MODIFY COLUMN chunks MAX_INPUT_TOKENS='512';

Изменение применяется к embeddings, созданным после этого; существующие векторы остаются как есть. Опцию можно задать при CREATE TABLE или изменить позже без re-embedding таблицы. Значение 0 или отсутствие опции использует собственный лимит модели.

В этом же направлении исправлены две менее заметные проблемы: модели больше не остаются в cache после изменения embedding-колонки, а конфигурации с разными API_TIMEOUT или MAX_INPUT_TOKENS больше не сталкиваются и не переиспользуют неверную cached model.


UTF-8 идентификаторы и лучшее сопоставление немецких слов

Имена таблиц, полей и атрибутов теперь используют единый [безопасный синтаксис UTF-8 идентификаторов](https://mnt.cr/go/6un5co [12] RT, percolate, distributed, template и plain tables могут использовать локализованные имена, например китайские или кириллические идентификаторы, в DDL, выражениях, field selectors и inferred source schemas.

Немецкая AOT-морфология получила опциональную нормализацию sharp-s. С charset_table=non_cont,german и morphology=lemmatize_de_v2 или lemmatize_de_v2_all формы вроде Straße, Strasse и STRAẞE совпадают в ordinary whole-word searches. Если включён index_exact_words=1, exact-word queries всё ещё могут различать формы ß и ss.


Улучшения load testing и backup

[manticore-load](https://mnt.cr/go/sdBXEJ [13] теперь может запускать benchmark через HTTP JSON API с --http. Записи используют /bulk, поиски — /search, а --table выбирает целевую таблицу. Отчёты теперь включают RSS локального searchd во время запуска, а также peak RSS, disk и CPU statistics в конце, включая aggregate monitoring для multi-command workloads.

[Manticore Backup](https://mnt.cr/go/2yXrq7 [14] теперь работает с authenticated Manticore Search installations через username/password или bearer-token credentials. SQL [BACKUP](https://mnt.cr/go/eqvadg [15] получил отдельное authorization action и проверяет read access к выбранным таблицам.

S3 backups и restores также могут использовать AWS SDK credential provider chain, когда static keys не заданы. Это включает IRSA, shared credentials, ECS task roles и EC2 instance profiles. Temporary credentials могут задавать AWS_SESSION_TOKEN.

Columnar-атрибуты используют mmap по умолчанию

Manticore Search теперь по умолчанию ставит [access_columnar_attrs](https://mnt.cr/go/6A7EpL [16] в mmap. Операционная система отображает и кэширует файлы columnar-атрибутов *.spc по требованию, без предварительного чтения всего файла на старте. Прежний buffered path остаётся доступен через access_columnar_attrs='file'.

ALTER TABLE также переоткрывает заменённое columnar storage с настроенным режимом доступа, поэтому изменённая таблица больше не откатывается к другому reader, отличному от запрошенного.


Исправления vector и grouped search

Несколько исправлений касаются запросов, которые были валидными, но могли возвращать неполные результаты или падать при определённой структуре таблиц:

  • Distributed и sharded KNN queries с local shard больше не пересчитывают merged 1-bit-quantized results дважды, что могло привести к crash coordinator или неверному nearest neighbor. ([Issue #4791](https://mnt.cr/go/iuOi6U [17]

  • KNN queries с дополнительными filters избегают лишнего knn_dist prefilter, когда HNSW уже исключает документы без векторов. ([PR #4861](https://mnt.cr/go/UTI8PT [18]

  • LENGTH() для float_vector_array теперь возвращает количество векторов, а не внутренний storage-word count. ([PR #4879](https://mnt.cr/go/he0eBc [19]

  • Hybrid search с GROUP BY сохраняет все buckets, включая MVA groups, и соблюдает final и within-group ordering. ([Issue #4639](https://mnt.cr/go/W77QRM [20]

  • Hybrid filters по weight() и expressions или aliases, derived from it, теперь выполняются после fusion по итоговому text weight, а не игнорируются. Weight-dependent filters внутри OR trees остаются неподдержанными и возвращают явную ошибку [21]. ([Issue #4889](https://mnt.cr/go/VOf6Qq [22]

  • Multi-chunk RT grouping больше не рискует duplicate groups, неверными split counts или hang при ordering COUNT(DISTINCT ...) results. ([Issue #4856](https://mnt.cr/go/fwDLRA [23]

  • Фильтры по document ID, signed representation которых отрицательный, теперь следуют unsigned ordering lookup index. ([Issue #4774](https://mnt.cr/go/VPvgyV [24]

Также исправлены crash-сценарии: второй hybrid-search statement в multi-statement request ([PR #4864](https://mnt.cr/go/i5Kymv [25], distributed JSON aggregation с сортировкой по string attribute ([Issue #4822](https://mnt.cr/go/NCIurP [26] и drop table во время auto-embedding precommit ([Issue #4860](https://mnt.cr/go/D22E3f [27]

Bulk ingestion стал предсказуемее

Elasticsearch-compatible /_bulk requests теперь возвращают HTTP 200 после обработки batch, а отдельные ошибки остаются видны через errors: true и per-item statuses. Duplicate create actions возвращают per-item 409 version_conflict_engine_exception, включая дубликаты внутри одного batch. Это не даёт клиентам вроде Fluent Bit повторять [28] записи, которые уже успешно прошли.

Fixed-length gzip-compressed /bulk bodies теперь корректно декодируются, даже если приходят через несколько socket reads. А если native bulk processing падает из-за отсутствия целевой таблицы, request снова может дойти до auto-schema fallback Manticore с валидным NDJSON и сохранить ожидаемый bulk response envelope.


Ещё исправления надёжности

Остальная часть релиза закрывает широкий набор operational и compatibility проблем:

  • searchd --stopwait больше не зависает, пока sharded table rebalanced после возвращения node. ([Issue #3905](https://mnt.cr/go/jopxPb [29]

  • Совместимые старые binlogs безопасно replay during upgrade, а completed RT chunks публикуются перед clean shutdown. ([Issue #4808](https://mnt.cr/go/y6w4GH [30] Fatal replay diagnostics также называют нужный recovery flag. ([Issue #4811](https://mnt.cr/go/9w6uNo [31]

  • indexer создаёт отсутствующие parent directories для plain-table paths, если ближайший существующий parent writable. ([Issue #4793](https://mnt.cr/go/2AyJ8K [32]

  • UUID document IDs больше не приводят к пустым stored text fields. ([Issue #4833](https://mnt.cr/go/hErEYm [33]

  • ALTER TABLE ... RENAME сохраняет hidden remote embedding API keys, не показывая их в SHOW CREATE TABLE. ([Issue #4842](https://mnt.cr/go/YuCTPF [34]

  • Compatibility probes Sequel Ace 5.3.1+ снова работают. ([Issue #4828](https://mnt.cr/go/bVXFrw [35]

  • JSON /search сохраняет distances для negated NEAR и proximity operators. ([Issue #4784](https://mnt.cr/go/tsDLTu [36]

  • Internal string-sort helper columns больше не протекают из LEFT JOIN results. ([Issue #4788](https://mnt.cr/go/wS6uNG [37]

  • Malformed binary API SEARCH element counts теперь отклоняются, а не завершают searchd. ([PR #4790](https://mnt.cr/go/8l9q4g [38]

Полный список — в [changelog версии 29.9.0](https://mnt.cr/go/Zf4B8X [39]


Как получить Manticore Search 29.9.0

Установите или обновите Manticore Search по [инструкции по установке](https://mnt.cr/go/6d9yh8 [1] Если вы используете columnar-атрибуты, немецкую AOT-морфологию или authenticated backups, посмотрите notes по обновлению выше.

Нужна помощь или хотите пообщаться?

Автор: ManticoreSearch

Источник [43]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/35411

URLs in this post:

[1] https://mnt.cr/go/6d9yh8: https://mnt.cr/go/6d9yh8

[2] @tudorvasinca: https://www.braintools.ru/users/tudorvasinca

[3] https://mnt.cr/go/TIds5B: https://mnt.cr/go/TIds5B

[4] https://mnt.cr/go/B1SXr5: https://mnt.cr/go/B1SXr5

[5] https://mnt.cr/go/O0eEjC: https://mnt.cr/go/O0eEjC

[6] https://mnt.cr/go/drbfcB: https://mnt.cr/go/drbfcB

[7] поведение: http://www.braintools.ru/article/9372

[8] https://mnt.cr/go/fCxeBG: https://mnt.cr/go/fCxeBG

[9] поведение: http://www.braintools.ru/article/5593

[10] https://mnt.cr/go/UuFwcw: https://mnt.cr/go/UuFwcw

[11] https://mnt.cr/go/zZvLPe: https://mnt.cr/go/zZvLPe

[12] https://mnt.cr/go/6un5co: https://mnt.cr/go/6un5co

[13] https://mnt.cr/go/sdBXEJ: https://mnt.cr/go/sdBXEJ

[14] https://mnt.cr/go/2yXrq7: https://mnt.cr/go/2yXrq7

[15] https://mnt.cr/go/eqvadg: https://mnt.cr/go/eqvadg

[16] https://mnt.cr/go/6A7EpL: https://mnt.cr/go/6A7EpL

[17] https://mnt.cr/go/iuOi6U: https://mnt.cr/go/iuOi6U

[18] https://mnt.cr/go/UTI8PT: https://mnt.cr/go/UTI8PT

[19] https://mnt.cr/go/he0eBc: https://mnt.cr/go/he0eBc

[20] https://mnt.cr/go/W77QRM: https://mnt.cr/go/W77QRM

[21] ошибку: http://www.braintools.ru/article/4192

[22] https://mnt.cr/go/VOf6Qq: https://mnt.cr/go/VOf6Qq

[23] https://mnt.cr/go/fwDLRA: https://mnt.cr/go/fwDLRA

[24] https://mnt.cr/go/VPvgyV: https://mnt.cr/go/VPvgyV

[25] https://mnt.cr/go/i5Kymv: https://mnt.cr/go/i5Kymv

[26] https://mnt.cr/go/NCIurP: https://mnt.cr/go/NCIurP

[27] https://mnt.cr/go/D22E3f: https://mnt.cr/go/D22E3f

[28] повторять: http://www.braintools.ru/article/4012

[29] https://mnt.cr/go/jopxPb: https://mnt.cr/go/jopxPb

[30] https://mnt.cr/go/y6w4GH: https://mnt.cr/go/y6w4GH

[31] https://mnt.cr/go/9w6uNo: https://mnt.cr/go/9w6uNo

[32] https://mnt.cr/go/2AyJ8K: https://mnt.cr/go/2AyJ8K

[33] https://mnt.cr/go/hErEYm: https://mnt.cr/go/hErEYm

[34] https://mnt.cr/go/YuCTPF: https://mnt.cr/go/YuCTPF

[35] https://mnt.cr/go/bVXFrw: https://mnt.cr/go/bVXFrw

[36] https://mnt.cr/go/tsDLTu: https://mnt.cr/go/tsDLTu

[37] https://mnt.cr/go/wS6uNG: https://mnt.cr/go/wS6uNG

[38] https://mnt.cr/go/8l9q4g: https://mnt.cr/go/8l9q4g

[39] https://mnt.cr/go/Zf4B8X: https://mnt.cr/go/Zf4B8X

[40] https://mnt.cr/go/IvlPzm: https://mnt.cr/go/IvlPzm

[41] https://mnt.cr/go/WKDBs8: https://mnt.cr/go/WKDBs8

[42] https://mnt.cr/go/PTcXwo: https://mnt.cr/go/PTcXwo

[43] Источник: https://habr.com/ru/articles/1081448/?utm_campaign=1081448&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100