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
- Pakiet: groupdocs-search-net 26.10.0
- Polecenie instalacji:
pip install groupdocs-search-net==26.10.0
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