Nous sommes heureux d’annoncer la sortie de GroupDocs.Search for Python v26.10, disponible à partir de novembre 2026. Il s’agit de la version initiale du produit, apportant la pleine fonctionnalité du moteur GroupDocs.Search 26.10 aux développeurs Python. Elle permet de créer et de maintenir des index plein texte sur des dossiers de documents — y compris PDF, Word, Excel, PowerPoint, e‑mail, eBook, archive et de nombreux autres formats (plus de 80 au total) — et de les rechercher avec des types de requêtes avancés : mot‑clé, phrase, caractère générique, expression régulière, flou, booléen, à facettes et recherches par intervalle de dates. La version prend en charge Python 3.5–3.14 sur Windows x64, Linux x64 (glibc 2.27+), et macOS 13+ (Intel et Apple Silicon), intégrant le runtime .NET 10.0.14.
Nouveautés de cette version
- [Fonctionnalité] Version initiale de GroupDocs.Search for Python via .NET (SEARCHPYTHONNET-40)
Modifications de l’API publique
Il s’agit de la première version, il n’y a donc rien à mettre à jour. L’API suit GroupDocs.Search for .NET 26.10 : les classes conservent leurs noms .NET, tandis que les méthodes, propriétés et paramètres sont écrits en snake_case (Index.Search devient index.search, SearchResult.DocumentCount devient result.document_count) et les membres d’énumération en majuscules (OutputFormat.HTML). L’affectation d’un attribut qu’une classe ne possède pas lève AttributeError avec une suggestion « Did you mean », au lieu de créer un attribut propre à Python que le moteur ne voit jamais.
Modules
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.
Nouvelles fonctionnalités
Indexer des documents et les rechercher
Index(folder) crée un index dans un dossier, ou ouvre l’index déjà présent. add() indexe un dossier, un fichier, une liste de chemins, des flux ou des données extraites, et search() accepte une requête dans le langage de requête GroupDocs.Search : mots‑clés, phrases entre guillemets, caractères génériques (? pour un caractère, ?(1~5) pour un à cinq), expressions régulières après ^, AND, OR et NOT, requêtes de champ telles que content: Bern ou filename: einstein, ainsi que des intervalles de dates et de nombres. SearchQuery construit les mêmes requêtes sous forme d’objets.
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))
Recherche floue, par synonymes et formes de mots
La recherche floue tolère les erreurs de frappe et d’OCR. La recherche par synonymes, homophones et formes de mots élargit une requête grâce aux dictionnaires anglais intégrés, que index.dictionaries vous permet de modifier, et la correction orthographique ainsi que la correction de disposition du clavier sont également des options de recherche.
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)
Surligner ce qui a été trouvé
DocumentHighlighter écrit un document complet avec les termes trouvés marqués, et FragmentHighlighter uniquement les fragments autour d’eux, au format HTML ou texte brut, dans un fichier, une chaîne ou un objet fichier binaire.
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")
Événements .NET comme gestionnaires Python
Chaque événement de l’index est un événement Python : abonnez‑vous avec += et désabonnez‑vous avec -=. Un gestionnaire peut ignorer un document, le marquer avec des attributs ou fournir son mot de passe, et suit la progression, les erreurs et les phases d’indexation et de recherche.
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")
Objets Python pour les points d’extension du moteur
Les extracteurs de texte personnalisés pour vos propres formats, les enregistreurs, les séparateurs de mots, les fournisseurs de formes de mots, les chargeurs de documents et les connecteurs OCR sont de simples objets ou fonctions Python, que le moteur invoque via ses 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")
Maintenir un index à jour
Un index est un dossier : créez‑le une fois et rouvrez‑le lors d’une exécution ultérieure. update() ré‑indexe uniquement les documents qui ont changé depuis le dernier add() ou update(), optimize() fusionne les segments d’index, et delete() supprime les documents par chemin.
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")
Une licence depuis l’environnement
Définissez GROUPDOCS_LIC_PATH sur le chemin ou l’URL d’un fichier de licence, et la licence est appliquée lors du premier appel au moteur ; License().set_license(path) fait de même dans le code. Une licence qui ne peut pas être appliquée lève LicenseError dès ce premier appel, au lieu de revenir en mode d’évaluation. Sans licence, un index accepte au maximum 100 documents et seuls les 10 premiers documents trouvés d’une recherche peuvent être lus.
export GROUPDOCS_LIC_PATH="/path/to/GroupDocs.Search.lic"
Exemple de code
Voir les sections « Indexer des documents et les rechercher », « Recherche floue, par synonymes et formes de mots », « Surligner ce qui a été trouvé », « Événements .NET comme gestionnaires Python », « Objets Python pour les points d’extension du moteur » et « Maintenir un index à jour » ci‑dessus pour des exemples de code fonctionnels.
Comment obtenir la mise à jour
PyPI
- Paquet : groupdocs-search-net 26.10.0
- Commande d’installation :
pip install groupdocs-search-net==26.10.0
Téléchargement direct
Téléchargez le fichier wheel pour votre plateforme depuis la page GroupDocs.Search for Python via .NET 26.10, puis installez le fichier :
- 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