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

Прямая загрузка

Ресурсы