GroupDocs.Search for .NET 26.10 теперь доступен. Это крупный релиз: формат индекса был переработан, поэтому индексы занимают меньше места на диске, требуют вдвое меньше ОЗУ и открываются в 2–4 раза быстрее. Поиск, удаление, оптимизация и поиск по изображениям ускорены в несколько‑до‑сотни раз, поиск больше не ждёт завершения индексации, а данные индекса защищены контрольными суммами и атомарными обновлениями.
Существующие индексы, созданные версиями 22.7–26.8, конвертируются в новый формат без переиндексации. В релизе 22 изменения: 4 новых функции, 15 улучшений и 3 исправления.
Основные показатели производительности
Большинство выигрышей растёт с размером индекса и количеством его сегментов.
| Что | Увеличение в 26.10 |
|---|---|
| ОЗУ, требуемое загруженным индексом | в 2 раза меньше |
| Открытие индекса | в 2–4 раза быстрее |
| Размер индекса на диске | Растёт пропорционально индексируемым данным; чем больше индекс, тем больше экономия |
| Поиск слова в больших индексах | До 2 раз быстрее; редкие слова в 10–40 раз быстрее |
| Нечеткий поиск в больших индексах | в 2,5–5 раз быстрее |
| Поиск по шаблону (wildcard) в больших индексах | в 2,5–3 раза быстрее |
| Поиск по шаблону, регулярному выражению, числовому диапазону и нечеткий поиск по чанкам | в 7–150 раз быстрее |
| Поиск по диапазону дат | в 2–27 раз быстрее |
| Удаление документов | Сотни раз быстрее, в 4 раза меньше памяти, без дополнительного места на диске |
| Оптимизация индекса | в 4 раза быстрее, в 4 раза меньше памяти |
| Пиковое ОЗУ во время индексации | в 2 раза меньше |
| Получение сохранённого текста документа | До 15 раз быстрее |
| Данные поиска по изображениям | в 2,9 раза меньше памяти, загружаются в 6,6 раз быстрее, сохраняются в 100 раз быстрее; обратный поиск по изображению до 1,8 раза быстрее |
| Поиск во время модификации индекса | Больше не блокируется |
| Надёжность индекса | Контрольные суммы и атомарные изменения; прерванные операции завершаются или откатываются |
| Потоки поиска | Все ядра процессора по умолчанию; можно изменить в любой момент |
Что нового в этом выпуске
| Ключ | Краткое описание | Категория |
|---|---|---|
| SEARCHNET-3665 | Реализовать возможность изменения количества потоков поиска в любой момент | Функция |
| SEARCHNET-3666 | Реализовать опцию замены непарных суррогатных символов | Функция |
| SEARCHNET-3667 | Реализовать опцию пропуска терминов, состоящих только из смешанных символов | Функция |
| SEARCHNET-3668 | Реализовать обновление версии индекса до нового формата без переиндексации документов | Функция |
| SEARCHNET-3669 | Оптимизировать потребление дискового пространства индексом | Улучшение |
| SEARCHNET-3670 | Оптимизировать потребление ОЗУ загруженным индексом | Улучшение |
| SEARCHNET-3671 | Оптимизировать скорость загрузки индекса | Улучшение |
| SEARCHNET-3672 | Оптимизировать скорость поиска в больших индексах | Улучшение |
| SEARCHNET-3673 | Оптимизировать нечеткий поиск | Улучшение |
| SEARCHNET-3674 | Оптимизировать поиск по шаблону (wildcard) | Улучшение |
| SEARCHNET-3675 | Оптимизировать удаление и обновление документов | Улучшение |
| SEARCHNET-3676 | Оптимизировать операцию оптимизации индекса | Улучшение |
| SEARCHNET-3677 | Позволить поиск во время модификации индекса | Улучшение |
| SEARCHNET-3678 | Улучшить надёжность индекса | Улучшение |
| SEARCHNET-3679 | Оптимизировать использование памяти во время индексации | Улучшение |
| SEARCHNET-3680 | Оптимизировать получение текста документа | Улучшение |
| SEARCHNET-3681 | Оптимизировать поиск по изображениям | Улучшение |
| SEARCHNET-3682 | Реализовать одинаковую обработку регистра букв на всех платформах | Улучшение |
| SEARCHNET-3688 | Оптимизировать поиск по чанкам | Улучшение |
| SEARCHNET-3683 | Исправить значение по умолчанию количества потоков поиска | Исправление |
| SEARCHNET-3684 | Предотвратить несогласованную индексацию после изменения словарей терминов | Исправление |
| SEARCHNET-3685 | Предотвратить слияние индексов, которые обрабатывают текст по‑разному | Исправление |
Основные возможности
Хранение и надёжность индекса
- Размер индекса теперь растёт пропорционально индексируемым данным, поэтому большие индексы с множеством сегментов экономят больше всего места.
- Загруженный индекс требует вдвое меньше ОЗУ, а открытие индекса происходит в 2–4 раза быстрее.
- Данные индекса защищены контрольными суммами, а все изменения применяются атомарно. Если операция прерывается ошибкой, отключением питания или завершением процесса, индекс остаётся в предыдущем согласованном состоянии.
Поиск
- Читаются только те сегменты, которые содержат запросные термины, что ускоряет поиск слов, нечеткий поиск, поиск по шаблону и поиск по чанкам.
- Поиск использует все ядра процессора по умолчанию, а количество потоков можно изменить в любой момент через
IndexSettings.SearchThreads. - Поиск и операции, изменяющие индекс (индексация, обновление, удаление, слияние, оптимизация), больше не блокируют друг друга. Каждый поиск работает с согласованным снимком индекса.
Индексация и обслуживание
- Удаление документов больше не переписывает индекс: документы сразу исключаются из поиска и физически удаляются во время оптимизации.
- Оптимизация индекса в 4 раза быстрее и использует в 4 раза меньше памяти; очень большие индексы оптимизируются в несколько сегментов ограниченного размера.
- Индексация потребляет примерно вдвое меньше пикового ОЗУ.
Обработка текста
- Регистрозависимость обрабатывается одинаково в .NET Framework и .NET, поэтому результаты поиска не зависят от платформы.
- Непарные суррогатные символы заменяются символом замены Unicode (U+FFFD) вместо удаления, а термины, состоящие только из смешанных символов, больше не индексируются.
Изменения публичного API
В класс GroupDocs.Search.IndexSettings добавлены два свойства:
Boolean ReplaceUnpairedSurrogates— заменяет непарные UTF‑16 суррогатные символы на символ замены Unicode (U+FFFD). Включено по умолчанию.Boolean SkipBlendedOnlyTerms— исключает из индексации термины, состоящие только из смешанных символов. Включено по умолчанию.
Обе настройки фиксируются при создании индекса.
Пример кода
Следующий пример обновляет индекс, созданный предыдущей версией, до нового формата без переиндексации документов.
string sourceIndexFolder = @"c:\MyOldIndex\"; // Specify path to the index of a previous version
string targetIndexFolder = @"c:\MyNewIndex\"; // Specify path to the folder for the updated index
IndexUpdater updater = new IndexUpdater(); // Creating an index updater
if (updater.CanUpdateVersion(sourceIndexFolder)) // Checking whether the index version can be updated
{
VersionUpdateResult result = updater.UpdateVersion(sourceIndexFolder, targetIndexFolder); // Updating the index version; the source index is not changed
}
Заметки по обновлению
Учтите следующие изменения при переходе с предыдущей версии:
- Формат индекса изменён. Индексы предыдущих версий необходимо конвертировать с помощью класса
IndexUpdaterперед открытием. Исходные документы не требуются, конвертированный индекс сохраняется в отдельную папку, исходный индекс не изменяется. - Словари терминов фиксируются после того, как в индексе появятся документы. Алфавит, словарь токенизации, замены символов, стоп‑слова и настройки
UseStopWordsиUseCharacterReplacementsдолжны быть сконфигурированы до индексации первого документа. Позднее изменение приводит кInvalidOperationException. - Несовместимые индексы не сливаются.
Index.MergeбросаетInvalidOperationException, если объединяемые индексы разбивают текст на термины по‑разному. - Поиск многопоточный по умолчанию. При значении
IndexSettings.SearchThreadsпо умолчанию поиск использует столько потоков, сколько ядер процессора. Чтобы ограничить количество потоков, задайте свойство явно. - Две новые настройки индекса включены по умолчанию. Чтобы сохранить прежнее поведение, установите
ReplaceUnpairedSurrogatesиSkipBlendedOnlyTermsвfalseперед созданием индекса. - Удалённые документы физически удаляются во время оптимизации. Вызовите
Index.Optimize, чтобы освободить место. - Количество чанков изменилось. Поиск по чанкам больше не возвращает чанк для каждого сегмента. Итерируйте чанки, пока
SearchResult.NextChunkSearchTokenне равенnull, вместо того чтобы полагаться на количество сегментов.
Как получить обновление
NuGet
- NuGet – Установите последнюю версию пакета:
# Package Manager
NuGet\Install-Package GroupDocs.Search -Version 26.10.0
# .NET CLI
dotnet add package GroupDocs.Search --version 26.10.0
# Package Manager
NuGet\Install-Package GroupDocs.Search.NETFramework -Version 26.10.0
# .NET CLI
dotnet add package GroupDocs.Search.NETFramework --version 26.10.0
Прямая загрузка
- Прямая загрузка – Скачайте скомпилированные сборки для .NET со страницы официального релиза:
https://releases.groupdocs.com/search/net/new-releases/groupdocs.search-for-.net-26.10-dlls-only/
https://releases.groupdocs.com/search/net/new-releases/groupdocs.search-for-.net-26.10/
Ресурсы
- Полные примечания к выпуску – https://releases.groupdocs.com/search/net/release-notes/2026/groupdocs-search-for-net-26-10-release-notes/
- Документация – https://docs.groupdocs.com/search/net/
- Примеры кода – https://github.com/groupdocs-search/GroupDocs.Search-for-.NET/
- Форум бесплатной поддержки – https://forum.groupdocs.com/c/search/
- Использовать из AI‑агентов – сервер GroupDocs.Search MCP запускает этот движок локально для Claude, Cursor и Copilot: https://docs.groupdocs.com/search/mcp/ · Нужна ли вам векторная база данных, чтобы задавать вопросы о папке с документами?