Estamos felizes em anunciar o lançamento do GroupDocs.Search for Python v26.10, disponível a partir de novembro de 2026. Esta é a versão inicial do produto, trazendo toda a funcionalidade do mecanismo GroupDocs.Search 26.10 para desenvolvedores Python. Ele permite criar e manter índices de texto completo sobre pastas de documentos — incluindo PDF, Word, Excel, PowerPoint, e‑mail, eBook, arquivos compactados e muitos outros formatos (mais de 80 no total) — e pesquisá‑los com tipos avançados de consultas: palavra‑chave, frase, curinga, regex, difuso, booleano, facetado e pesquisas por intervalo de datas. A versão oferece suporte a Python 3.5–3.14 no Windows x64, Linux x64 (glibc 2.27+), e macOS 13+ (Intel e Apple Silicon), incorporando o runtime .NET 10.0.14.
Novidades nesta versão
- [Feature] Lançamento inicial do GroupDocs.Search for Python via .NET (SEARCHPYTHONNET-40)
Alterações na API pública
Esta é a primeira versão, portanto não há nada a atualizar. A API segue o GroupDocs.Search for .NET 26.10: as classes mantêm seus nomes .NET, enquanto métodos, propriedades e parâmetros são escritos em snake_case (Index.Search torna‑se index.search, SearchResult.DocumentCount torna‑se result.document_count) e os membros de enumeração em maiúsculas (OutputFormat.HTML). Atribuir um atributo que a classe não possui gera AttributeError com uma dica “Did you mean”, em vez de criar um atributo exclusivo do Python que o mecanismo nunca vê.
Módulos
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.
Novos recursos
Indexar documentos e pesquisá‑los
Index(folder) cria um índice em uma pasta ou abre o índice já existente. add() indexa uma pasta, um arquivo, uma lista de caminhos, streams ou dados extraídos, e search() recebe uma consulta na linguagem de consultas do GroupDocs.Search: palavras‑chave, frases entre aspas, curingas (? para um caractere, ?(1~5) para de um a cinco), expressões regulares após ^, AND, OR e NOT, consultas de campo como content: Bern ou filename: einstein, e intervalos de datas e números. SearchQuery constrói as mesmas consultas como objetos.
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))
Pesquisa difusa, por sinônimo e por forma de palavra
A pesquisa difusa tolera erros de digitação e OCR. A pesquisa por sinônimo, homófono e forma de palavra amplia a consulta por meio dos dicionários internos em inglês, que index.dictionaries permite editar, e a correção ortográfica e de layout de teclado também são opções de pesquisa.
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)
Realçar o que foi encontrado
DocumentHighlighter grava um documento inteiro com os termos encontrados marcados, e FragmentHighlighter apenas os fragmentos ao redor deles, como HTML ou texto simples, em um arquivo, uma string ou um objeto de arquivo binário.
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")
Eventos .NET como manipuladores Python
Todo evento do índice é um evento Python: inscreva‑se com += e cancele a inscrição com -=. Um manipulador pode pular um documento, marcá‑lo com atributos ou fornecer sua senha, e acompanha o progresso, erros e fases da indexação e da pesquisa.
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")
Objetos Python para os pontos de extensão do mecanismo
Extratores de texto personalizados para formatos próprios, registradores, divisores de palavras, provedores de formas de palavra, carregadores de documentos e conectores OCR são objetos ou funções Python simples, que o mecanismo invoca por meio de suas interfaces.
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")
Manter um índice atualizado
Um índice é uma pasta: construa‑o uma vez e reabra‑o em uma execução posterior. update() re‑indexa apenas os documentos que foram alterados desde o último add() ou update(), optimize() mescla os segmentos do índice, e delete() remove documentos pelo caminho.
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")
Licença a partir do ambiente
Defina GROUPDOCS_LIC_PATH para o caminho ou URL de um arquivo de licença, e a licença será aplicada na primeira chamada ao mecanismo; License().set_license(path) faz o mesmo no código. Uma licença que não puder ser aplicada gera LicenseError a partir dessa primeira chamada, em vez de reverter ao modo de avaliação. Sem licença, um índice aceita no máximo 100 documentos e apenas os primeiros 10 documentos encontrados em uma pesquisa podem ser lidos.
export GROUPDOCS_LIC_PATH="/path/to/GroupDocs.Search.lic"
Exemplo de código
Consulte as seções “Indexar documentos e pesquisá‑los”, “Pesquisa difusa, por sinônimo e por forma de palavra”, “Realçar o que foi encontrado”, “Eventos .NET como manipuladores Python”, “Objetos Python para os pontos de extensão do mecanismo” e “Manter um índice atualizado” acima para exemplos de código funcionais.
Como obter a atualização
PyPI
- Pacote: groupdocs-search-net 26.10.0
- Comando de instalação:
pip install groupdocs-search-net==26.10.0
Download direto
Baixe o wheel para sua plataforma na página GroupDocs.Search for Python via .NET 26.10 e, em seguida, instale o arquivo:
- 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