Nos complace anunciar el lanzamiento de GroupDocs.Search for Python v26.10, disponible a partir de noviembre de 2026. Esta es la versión inicial del producto, que lleva la funcionalidad completa del motor GroupDocs.Search 26.10 a los desarrolladores de Python. Permite crear y mantener índices de texto completo sobre carpetas de documentos — incluidos PDF, Word, Excel, PowerPoint, correo electrónico, eBook, archivo y muchos otros formatos (más de 80 en total) — y buscarlos con tipos de consultas avanzados: palabra clave, frase, comodín, expresiones regulares, difuso, booleano, facetado y búsquedas por rango de fechas. La versión admite Python 3.5–3.14 en Windows x64, Linux x64 (glibc 2.27+), y macOS 13+ (Intel y Apple Silicon), incorporando el runtime .NET 10.0.14.
Novedades en esta versión
- [Feature] Lanzamiento inicial de GroupDocs.Search for Python vía .NET (SEARCHPYTHONNET-40)
Cambios en la API pública
Esta es la primera versión, por lo que no hay nada que actualizar. La API sigue a GroupDocs.Search for .NET 26.10: las clases conservan sus nombres .NET, mientras que los métodos, propiedades y parámetros se escriben en snake_case (Index.Search es index.search, SearchResult.DocumentCount es result.document_count) y los miembros de enumeración en mayúsculas (OutputFormat.HTML). Asignar un atributo que una clase no tiene genera AttributeError con una pista de “¿Quisiste decir…?”, en lugar de crear un atributo solo de Python que el motor nunca ve.
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.
Nuevas características
Indexar documentos y buscarlos
Index(folder) crea un índice en una carpeta, o abre el índice que ya existe. add() indexa una carpeta, un archivo, una lista de rutas, flujos o datos extraídos, y search() recibe una consulta en el lenguaje de consultas de GroupDocs.Search: palabras clave, frases entre comillas, comodines (? para un carácter, ?(1~5) de uno a cinco), expresiones regulares después de ^, AND, OR y NOT, consultas de campo como content: Bern o filename: einstein, y rangos de fechas y números. SearchQuery construye las mismas 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))
Búsqueda difusa, sinónimos y de formas de palabras
La búsqueda difusa tolera errores de escritura y OCR. La búsqueda de sinónimos, homófonos y de formas de palabras amplía una consulta mediante los diccionarios integrados en inglés, que index.dictionaries permite editar, y la corrección ortográfica y de distribución del teclado también son opciones de búsqueda.
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)
Resaltar lo encontrado
DocumentHighlighter escribe un documento completo con los términos encontrados marcados, y FragmentHighlighter solo los fragmentos alrededor de ellos, como HTML o texto plano, en un archivo, una cadena o un objeto de archivo binario.
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 manejadores Python
Cada evento del índice es un evento Python: suscríbete con += y cancela la suscripción con -=. Un manejador puede omitir un documento, etiquetarlo con atributos o proporcionar su contraseña, y sigue el progreso, errores y fases de la indexación y búsqueda.
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 los puntos de extensión del motor
Los extractores de texto personalizados para tus propios formatos, registradores, separadores de palabras, proveedores de formas de palabras, cargadores de documentos y conectores OCR son objetos o funciones Python simples, que el motor invoca a través de sus 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")
Mantener un índice actualizado
Un índice es una carpeta: se crea una vez y se vuelve a abrir en una ejecución posterior. update() vuelve a indexar solo los documentos que cambiaron desde el último add() o update(), optimize() fusiona los segmentos del índice, y delete() elimina documentos por ruta.
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")
Una licencia desde el entorno
Establece GROUPDOCS_LIC_PATH con la ruta o URL de un archivo de licencia, y la licencia se aplica en la primera llamada al motor; License().set_license(path) hace lo mismo en código. Una licencia que no se pueda aplicar genera LicenseError desde esa primera llamada, en lugar de volver al modo de evaluación. Sin una licencia, un índice admite como máximo 100 documentos y solo se pueden leer los primeros 10 documentos encontrados en una búsqueda.
export GROUPDOCS_LIC_PATH="/path/to/GroupDocs.Search.lic"
Ejemplo de código
Vea las secciones “Indexar documentos y buscarlos”, “Búsqueda difusa, sinónimos y de formas de palabras”, “Resaltar lo encontrado”, “Eventos .NET como manejadores Python”, “Objetos Python para los puntos de extensión del motor” y “Mantener un índice actualizado” arriba para ejemplos de código funcionales.
Cómo obtener la actualización
PyPI
- Package: groupdocs-search-net 26.10.0
- Install command:
pip install groupdocs-search-net==26.10.0
Descarga directa
Descargue el wheel para su plataforma desde la página GroupDocs.Search for Python via .NET 26.10, luego instale el archivo:
- 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