Siamo felici di annunciare il rilascio di GroupDocs.Search for Python v26.10, disponibile a partire da novembre 2026. Questa è la versione iniziale del prodotto, che porta la piena funzionalità del motore GroupDocs.Search 26.10 agli sviluppatori Python. Consente di creare e mantenere indici full‑text su cartelle di documenti — inclusi PDF, Word, Excel, PowerPoint, email, eBook, archivi e molti altri formati (oltre 80 in totale) — e di cercarli con tipi di query avanzati: parole‑chiave, frasi, wildcard, regex, fuzzy, boolean, faceted e ricerche per intervallo di date. Il rilascio supporta Python 3.5–3.14 su Windows x64, Linux x64 (glibc 2.27+), e macOS 13+ (Intel e Apple Silicon), incorporando il runtime .NET 10.0.14.

Novità di questa versione

  • [Feature] Rilascio iniziale di GroupDocs.Search for Python via .NET (SEARCHPYTHONNET-40)

Modifiche all’API pubblica

Questa è la prima versione, quindi non c’è nulla da aggiornare. L’API segue GroupDocs.Search for .NET 26.10: le classi mantengono i loro nomi .NET, mentre metodi, proprietà e parametri sono scritti in snake_case (Index.Search è index.search, SearchResult.DocumentCount è result.document_count) e i membri enum in maiuscolo (OutputFormat.HTML). Assegnare un attributo che una classe non possiede genera AttributeError con un suggerimento “Did you mean”, invece di creare un attributo solo Python che il motore non vede mai.

Moduli

  • 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.

Nuove funzionalità

Indicizzare documenti e cercarli

Index(folder) crea un indice in una cartella, o apre l’indice già presente. add() indicizza una cartella, un file, un elenco di percorsi, stream o dati estratti, e search() accetta una query nel linguaggio di query GroupDocs.Search: parole‑chiave, frasi tra virgolette, wildcard (? per un carattere, ?(1~5) per da uno a cinque), espressioni regolari dopo ^, AND, OR e NOT, query di campo come content: Bern o filename: einstein, e intervalli di date e numeri. SearchQuery costruisce le stesse query come oggetti.

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))

Ricerca fuzzy, sinonimi e forme di parole

La ricerca fuzzy tollera errori di digitazione e OCR. La ricerca di sinonimi, omofoni e forme di parole amplia una query tramite i dizionari inglesi integrati, che index.dictionaries consente di modificare, e la correzione ortografica e della disposizione della tastiera sono anch’esse opzioni di ricerca.

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)

Evidenziare ciò che è stato trovato

DocumentHighlighter scrive l’intero documento con i termini trovati evidenziati, e FragmentHighlighter solo i frammenti intorno a essi, come HTML o testo semplice, in un file, una stringa o un oggetto file 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")

Eventi .NET come gestori Python

Ogni evento dell’indice è un evento Python: ci si iscrive con += e ci si cancella con -=. Un gestore può saltare un documento, etichettarlo con attributi o fornire la sua password, e segue il progresso, gli errori e le fasi di indicizzazione e ricerca.

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")

Oggetti Python per i punti di estensione del motore

Estrattori di testo personalizzati per i formati propri, logger, splitter di parole, provider di forme di parole, loader di documenti e connettori OCR sono semplici oggetti o funzioni Python, che il motore chiama tramite le proprie interfacce.

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")

Mantenere un indice aggiornato

Un indice è una cartella: lo si costruisce una volta e lo si riapre in un’esecuzione successiva. update() reindicizza solo i documenti modificati dall’ultimo add() o update(), optimize() unisce i segmenti dell’indice, e delete() rimuove i documenti per percorso.

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 licenza dall’ambiente

Imposta GROUPDOCS_LIC_PATH sul percorso o URL di un file di licenza, e la licenza viene applicata alla prima chiamata al motore; License().set_license(path) fa lo stesso nel codice. Una licenza che non può essere applicata genera LicenseError dalla prima chiamata in poi, invece di tornare alla modalità di valutazione. Senza licenza, un indice può contenere al massimo 100 documenti e solo i primi 10 documenti trovati da una ricerca possono essere letti.

export GROUPDOCS_LIC_PATH="/path/to/GroupDocs.Search.lic"

Esempio di codice

Vedi le sezioni “Indicizzare documenti e cercarli”, “Ricerca fuzzy, sinonimi e forme di parole”, “Evidenziare ciò che è stato trovato”, “Eventi .NET come gestori Python”, “Oggetti Python per i punti di estensione del motore” e “Mantenere un indice aggiornato” sopra per esempi di codice funzionanti.

Come ottenere l’aggiornamento

PyPI

Download diretto

Scarica il wheel per la tua piattaforma dalla pagina GroupDocs.Search for Python via .NET 26.10 e poi installa il 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

Risorse