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
- Package: groupdocs-search-net 26.10.0
- Install command:
pip install groupdocs-search-net==26.10.0
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