Мы рады объявить о выпуске 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
- Пакет: groupdocs-search-net 26.10.0
- Команда установки:
pip install groupdocs-search-net==26.10.0
Прямое скачивание
Скачайте 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