Z przyjemnością ogłaszamy wydanie GroupDocs.Search for Python v26.10, dostępne od listopada 2026. Jest to początkowe wydanie produktu, które przenosi pełną funkcjonalność silnika GroupDocs.Search 26.10 do programistów Pythona. Umożliwia budowanie i utrzymywanie indeksów pełnotekstowych nad folderami dokumentów — w tym PDF, Word, Excel, PowerPoint, e‑mail, e‑Book, archiwa i wiele innych formatów (ponad 80) — oraz ich przeszukiwanie przy użyciu zaawansowanych typów zapytań: słowo kluczowe, fraza, znak wieloznaczny, wyrażenie regularne, przybliżone, logiczne, fasetowe i wyszukiwanie w przedziałach dat. Wydanie obsługuje Pythona 3.5–3.14 na Windows x64, Linux x64 (glibc 2.27+), oraz macOS 13+ (Intel i Apple Silicon), wbudowując środowisko uruchomieniowe .NET 10.0.14.

Co nowego w tym wydaniu

  • [Feature] Początkowe wydanie GroupDocs.Search for Python via .NET (SEARCHPYTHONNET-40)

Zmiany w publicznym API

To jest pierwsze wydanie, więc nie ma nic do aktualizacji. API podąża za GroupDocs.Search for .NET 26.10: klasy zachowują swoje nazwy .NET, natomiast metody, właściwości i parametry są zapisywane w snake_case (Index.Search to index.search, SearchResult.DocumentCount to result.document_count), a elementy wyliczeń w wielkich literach (OutputFormat.HTML). Przypisanie atrybutu, którego klasa nie posiada, podnosi AttributeError z podpowiedzią „Czy miałeś na myśli”, zamiast tworzyć atrybut tylko w Pythonie, którego silnik nigdy nie widzi.

Moduły

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

Nowe funkcje

Indeksowanie dokumentów i ich przeszukiwanie

Index(folder) tworzy indeks w folderze lub otwiera istniejący indeks. add() indeksuje folder, plik, listę ścieżek, strumienie lub wyodrębnione dane, a search() przyjmuje zapytanie w języku zapytań GroupDocs.Search: słowa kluczowe, frazy w cudzysłowach, znaki wieloznaczne (? dla jednego znaku, ?(1~5) dla od jednego do pięciu), wyrażenia regularne po ^, AND, OR i NOT, zapytania pól takie jak content: Bern lub filename: einstein, oraz zakresy dat i liczb. SearchQuery buduje te same zapytania jako obiekty.

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

Wyszukiwanie przybliżone, synonimiczne i formy słów

Wyszukiwanie przybliżone toleruje błędy pisowni i OCR. Wyszukiwanie synonimów, homofonów i form słów rozszerza zapytanie przy użyciu wbudowanych słowników angielskich, które można edytować za pomocą index.dictionaries, a korekta pisowni i układu klawiatury to także opcje wyszukiwania.

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)

Podświetlanie znalezionych wyników

DocumentHighlighter zapisuje cały dokument z zaznaczonymi znalezionymi terminami, a FragmentHighlighter tylko fragmenty wokół nich, jako HTML lub zwykły tekst, do pliku, łańcucha znaków lub obiektu binarnego pliku.

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

Zdarzenia .NET jako obsługiwacze w Pythonie

Każde zdarzenie indeksu jest zdarzeniem Pythona: subskrybuj za pomocą += i wypisz się za pomocą -=. Obsługiwacz może pominąć dokument, oznaczyć go atrybutami lub podać jego hasło, oraz śledzić postęp, błędy i fazy indeksowania i wyszukiwania.

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

Obiekty Pythona dla punktów rozszerzeń silnika

Niestandardowe ekstraktory tekstu dla własnych formatów, loggery, dzielniki słów, dostawcy form słów, ładowarki dokumentów i łączniki OCR to zwykłe obiekty lub funkcje Pythona, które silnik wywołuje poprzez swoje interfejsy.

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

Utrzymywanie indeksu w aktualnym stanie

Indeks to folder: zbuduj go raz i otwórz ponownie w późniejszym uruchomieniu. update() ponownie indeksuje tylko dokumenty, które zmieniły się od ostatniego add() lub update(), optimize() łączy segmenty indeksu, a delete() usuwa dokumenty według ścieżki.

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

Licencja z środowiska

Ustaw GROUPDOCS_LIC_PATH na ścieżkę lub URL pliku licencji, a licencja zostanie zastosowana przy pierwszym wywołaniu silnika; License().set_license(path) robi to samo w kodzie. Licencja, której nie można zastosować, podnosi LicenseError od pierwszego wywołania, zamiast przełączać się w tryb ewaluacji. Bez licencji indeks może zawierać maksymalnie 100 dokumentów, a tylko pierwsze 10 znalezionych dokumentów w wynikach wyszukiwania może być odczytane.

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

Przykład kodu

Zobacz sekcje „Indeksowanie dokumentów i ich przeszukiwanie”, „Wyszukiwanie przybliżone, synonimiczne i formy słów”, „Podświetlanie znalezionych wyników”, „Zdarzenia .NET jako obsługiwacze w Pythonie”, „Obiekty Pythona dla punktów rozszerzeń silnika” oraz „Utrzymywanie indeksu w aktualnym stanie” powyżej, aby uzyskać działające przykłady kodu.

Jak uzyskać aktualizację

PyPI

Bezpośrednie pobranie

Pobierz plik wheel dla swojej platformy ze strony GroupDocs.Search for Python via .NET 26.10, a następnie zainstaluj plik:

  • 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

Zasoby