Мы рады объявить о выпуске GroupDocs.Search for Python v26.10, доступном с ноября 2026. Это первоначальный выпуск продукта, предоставляющий полную функциональность движка GroupDocs.Search 26.10 разработчикам Python. Он позволяет создавать и поддерживать полнотекстовые индексы над папками с документами — включая PDF, Word, Excel, PowerPoint, электронную почту, eBook, архивы и многие другие форматы (всего более 80) — и выполнять поиск по ним с использованием продвинутых типов запросов: ключевые слова, фразы, подстановочные знаки, регулярные выражения, нечеткий поиск, булевы запросы, фасетный поиск и поиск по диапазону дат. Выпуск поддерживает Python 3.5–3.14 на Windows x64, Linux x64 (glibc 2.27+) и macOS 13+ (Intel и Apple Silicon), включая среду выполнения .NET 10.0.14.

Что нового в этом выпуске

  • [Feature] Первоначальный выпуск GroupDocs.Search for Python через .NET (SEARCHPYTHONNET-40)

Изменения публичного API

Это первый выпуск, поэтому обновлять нечего. API следует за GroupDocs.Search for .NET 26.10: классы сохраняют свои .NET‑имена, а методы, свойства и параметры пишутся в snake_case (Index.Search → index.search, SearchResult.DocumentCount → result.document_count), а члены перечислений — в верхнем регистре (OutputFormat.HTML). Присвоение атрибута, которого у класса нет, вызывает AttributeError с подсказкой «Did you mean», вместо создания атрибута, известного только Python, который движок никогда не увидит.

Модули

  • groupdocs.search: Index, IndexSettings, IndexRepository, IndexUpdater, SearchQuery, Extractor, License, Metered, GroupDocsSearchException, LicenseError, CancellationTokenSource.
  • groupdocs.search.options: IndexingOptions, SearchOptions, FuzzySearchOptions, SimilarityLevel, UpdateOptions, HighlightOptions, OutputFormat, SeparateProcessOptions, ImageSearchOptions.
  • groupdocs.search.results: SearchResult, FoundDocument, FoundDocumentField, DocumentInfo, FileType, FormatFamily.
  • groupdocs.search.highlighters: DocumentHighlighter, FragmentHighlighter.
  • groupdocs.search.common: FileOutputAdapter, StringOutputAdapter, StreamOutputAdapter, Document, DocumentField, ExtractedData, FileLogger, AttributeChangeBatch.
  • groupdocs.search.dictionaries: SynonymDictionary, HomophoneDictionary, StopWordDictionary, SpellingCorrector, AliasDictionary, CharacterReplacementPair.
  • groupdocs.search.events: EventHub, FileIndexingEventArgs, IndexErrorEventArgs, OperationProgressEventArgs, PasswordRequiredEventArgs.
  • groupdocs.search.exceptions: SearchException, LicenseRestrictionException.
  • groupdocs.search.scaling: SearchNetworkNode, Indexer, Searcher.
  • groupdocs.search.scaling.configuring: Configuration, Configurator, TcpSettings.

Новые возможности

Индексировать документы и выполнять поиск

Index(folder) создаёт индекс в указанной папке или открывает уже существующий. add() индексирует папку, файл, список путей, потоки или извлечённые данные, а search() принимает запрос на языке GroupDocs.Search: ключевые слова, фразы в кавычках, подстановочные знаки (? — один символ, ?(1~5) — от одного до пяти), регулярные выражения после ^, логические операторы AND, OR и NOT, запросы по полям, например content: Bern или filename: einstein, а также диапазоны дат и чисел. SearchQuery формирует такие же запросы в виде объектов.

from groupdocs.search import Index

with Index("./index") as index:              # создаёт папку индекса или открывает её
    index.add("./documents")                 # индексирует каждый поддерживаемый файл в папке
    for query in ["relativity", '"theory of relativity"', "relativ?ty",
                  "^relativ.*", "Einstein AND NOT Newton", "content: Bern"]:
        result = index.search(query)
        print("%-26s %d documents, %d occurrences"
              % (query, result.document_count, result.occurrence_count))

Нечеткий, синонимический и поиск по формам слов

Нечеткий поиск tolerates typing and OCR errors. Синонимический, гомофонический и поиск по формам слов расширяют запрос с помощью встроенных английских словарей, которые можно редактировать через index.dictionaries; исправление орфографии и раскладки клавиатуры также доступны как параметры поиска.

from groupdocs.search import Index
from groupdocs.search.options import SearchOptions, SimilarityLevel

with Index("./index") as index:
    index.add("./documents")

    fuzzy = SearchOptions()
    fuzzy.fuzzy_search.enabled = True
    fuzzy.fuzzy_search.fuzzy_algorithm = SimilarityLevel(0.8)   # 0.0 (свободно) .. 1.0 (строго)
    print("relativty:", index.search("relativty").document_count,
          "->", index.search("relativty", fuzzy).document_count)

    synonyms = SearchOptions()
    synonyms.use_synonym_search = True
    print("picture:", index.search("picture").document_count,
          "->", index.search("picture", synonyms).document_count)

    word_forms = SearchOptions()
    word_forms.use_word_forms_search = True
    print("letter:", index.search("letter").document_count,
          "->", index.search("letter", word_forms).document_count)

Выделить найденное

DocumentHighlighter записывает весь документ с отмеченными найденными терминами, а FragmentHighlighter — только фрагменты вокруг них, в формате HTML или простого текста, в файл, строку или бинарный объект.

from groupdocs.search import Index
from groupdocs.search.common import FileOutputAdapter
from groupdocs.search.highlighters import DocumentHighlighter
from groupdocs.search.options import OutputFormat

with Index("./index") as index:
    index.add("./documents")
    result = index.search("relativity")
    if result.document_count > 0:
        found = result.get_found_document(0)
        adapter = FileOutputAdapter(OutputFormat.HTML, "./highlighted.html")
        index.highlight(found, DocumentHighlighter(adapter))
        print(found.document_info.file_path, "-> highlighted.html")

События .NET как обработчики Python

Каждое событие индекса представлено как событие Python: подписка через +=, отписка через -=. Обработчик может пропустить документ, пометить его атрибутами или предоставить пароль, а также отслеживать прогресс, ошибки и фазы индексации и поиска.

from groupdocs.search import Index

skipped = []

def on_file_indexing(sender, args):
    if args.document_full_path.endswith(".zip"):
        args.skip_indexing = True            # исключаем архивы из индекса
        skipped.append(args.document_full_path)

with Index("./index") as index:
    index.events.file_indexing += on_file_indexing
    index.add("./documents")
    index.events.file_indexing -= on_file_indexing
    print(len(index.get_indexed_documents()), "documents indexed,", len(skipped), "archives skipped")

Объекты Python для точек расширения движка

Пользовательские извлекатели текста для собственных форматов, логгеры, разделители слов, провайдеры форм слов, загрузчики документов и коннекторы OCR — это обычные объекты или функции Python, которые движок вызывает через свои интерфейсы.

from groupdocs.search import Index, IndexSettings

class LogExtractor(object):
    """Текст из .log‑файлов, который движок не читает самостоятельно."""
    extensions = [".log"]

    def get_fields(self, source):             # путь к файлу или поток движка
        if isinstance(source, str):
            with open(source, encoding="utf-8") as f:
                text = f.read()
        else:
            text = source.read().decode("utf-8")
        return [("Content", text)]

settings = IndexSettings()
settings.custom_extractors.add(LogExtractor())
with Index("./log-index", settings) as index:
    index.add("./logs")
    print(index.search("quota").document_count, "log file(s) mention a quota")

Поддерживать индекс в актуальном состоянии

Индекс — это папка: создаёте её один раз и открываете при последующих запусках. update() переиндексирует только те документы, которые изменились с момента последнего add() или update(), optimize() объединяет сегменты индекса, а delete() удаляет документы по пути.

from groupdocs.search import Index

with Index("./index") as index:
    index.add("./documents")
    # ... файлы в ./documents добавляются, изменяются или удаляются ...
    index.update()        # переиндексирует только изменённое
    index.optimize()      # объединяет сегменты индекса для быстрой работы поиска
    print(len(index.get_indexed_documents()), "documents in the index")

Лицензия из окружения

Установите переменную GROUPDOCS_LIC_PATH в путь или URL к файлу лицензии, и лицензия будет применена при первом обращении к движку; License().set_license(path) делает то же самое в коде. Лицензия, которую невозможно применить, вызывает LicenseError уже с первого вызова, вместо перехода в режим оценки. Без лицензии индекс ограничен 100 документами, а из результатов поиска можно прочитать только первые 10 найденных документов.

export GROUPDOCS_LIC_PATH="/path/to/GroupDocs.Search.lic"

Пример кода

См. разделы «Индексировать документы и выполнять поиск», «Нечеткий, синонимический и поиск по формам слов», «Выделить найденное», «События .NET как обработчики Python», «Объекты Python для точек расширения движка» и «Поддерживать индекс в актуальном состоянии» выше для работающих примеров кода.

Как получить обновление

PyPI

Прямое скачивание

Скачайте wheel для вашей платформы со страницы GroupDocs.Search for Python via .NET 26.10 и установите файл:

  • Windows x64: pip install groupdocs_search_net-26.10.0-py3-none-win_amd64.whl
  • Linux x64: pip install groupdocs_search_net-26.10.0-py3-none-manylinux_2_27_x86_64.whl
  • macOS Intel: pip install groupdocs_search_net-26.10.0-py3-none-macosx_13_0_x86_64.whl
  • macOS Apple Silicon: pip install groupdocs_search_net-26.10.0-py3-none-macosx_13_0_arm64.whl

Ресурсы