Ми раді оголосити про випуск 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), а члени enum — у верхньому регістрі (OutputFormat.HTML). Присвоєння атрибуту, якого клас не має, викликає AttributeError з підказкою «Можливо, ви мали на увазі», замість створення лише 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:              # creates the index folder, or opens it
    index.add("./documents")                 # indexes every supported file in the folder
    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))

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

Нечіткий пошук допускає помилки набору та OCR. Пошук синонімів, омонімів та форм слів розширює запит за допомогою вбудованих англійських словників, які можна редагувати через 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 (loose) .. 1.0 (strict)
    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            # leave archives out of the index
        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):
    """Text of .log files, which the engine does not read on its own."""
    extensions = [".log"]

    def get_fields(self, source):             # a file path, or the engine's stream
        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")
    # ... files in ./documents are added, changed or removed ...
    index.update()        # re-indexes only what changed
    index.optimize()      # merges index segments so searches stay fast
    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 page, then install the file:

  • 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

Ресурси