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

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

Recursos