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

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

Ressources