ما خوشحالیم که انتشار GroupDocs.Search for Python v26.10 را اعلام می‌کنیم که از نوامبر 2026 در دسترس است. این اولین انتشار محصول است که تمام قابلیت‌های موتور GroupDocs.Search 26.10 را به توسعه‌دهندگان پایتون ارائه می‌دهد. این امکان را فراهم می‌کند تا فهرست‌های متن‌کامل را بر روی پوشه‌های اسناد—از جمله PDF، Word، Excel، PowerPoint، ایمیل، eBook، آرشیو و بسیاری فرمت‌های دیگر (بیش از 80) — ایجاد و نگهداری کنید و با انواع پیشرفتهٔ پرس‌و‌جو جستجو کنید: کلیدواژه، عبارت، کاراکتر جایگزین (wildcard)، عبارت منظم (regex)، fuzzy، منطقی (boolean)، faceted و جستجوهای بازهٔ تاریخ. این انتشار از Python 3.5–3.14 بر روی Windows x64، Linux x64 (glibc 2.27+) و macOS 13+ (Intel و Apple Silicon) پشتیبانی می‌کند و runtime .NET 10.0.14 را در خود دارد.

چه چیزهای جدیدی در این انتشار وجود دارد

  • [Feature] انتشار اولیه GroupDocs.Search برای پایتون از طریق .NET (SEARCHPYTHONNET-40)

تغییرات API عمومی

این اولین انتشار است، بنابراین چیزی برای ارتقا وجود ندارد. API مطابق با GroupDocs.Search برای .NET 26.10 است: کلاس‌ها نام‌های .NET خود را حفظ می‌کنند، در حالی که متدها، ویژگی‌ها و پارامترها به صورت snake_case نوشته می‌شوند (Index.Search به index.search تبدیل می‌شود، SearchResult.DocumentCount به result.document_count) و اعضای enum به حروف بزرگ (OutputFormat.HTML). اختصاص یک ویژگی که کلاس آن را ندارد، AttributeError با راهنمایی «آیا منظور شما این بود» را ایجاد می‌کند، به جای ایجاد یک ویژگی فقط پایتونی که موتور هرگز نمی‌بیند.

ماژول‌ها

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

ویژگی‌های جدید

فهرست‌گذاری اسناد و جستجوی آن‌ها

Index(folder) یک فهرست در یک پوشه ایجاد می‌کند یا فهرست موجود را باز می‌کند. add() یک پوشه، یک فایل، لیستی از مسیرها، جریان‌ها یا داده‌های استخراج‌شده را فهرست می‌کند و search() یک پرس‌و‌جو به زبان پرس‌و‌جوی GroupDocs.Search می‌گیرد: کلیدواژه‌ها، عبارات داخل نقل‌قول، کاراکترهای جایگزین (? برای یک کاراکتر، ?(1~5) برای یک تا پنج)، عبارات منظم پس از ^، AND، OR و NOT، پرس‌و‌جوهای میدانی مانند content: Bern یا filename: einstein، و بازه‌های تاریخ و عدد. SearchQuery همان پرس‌و‌جوها را به صورت اشیاء می‌سازد.

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

جستجوی فازی، مترادف و فرم کلمه

جستجوی فازی خطاهای تایپی و OCR را تحمل می‌کند. جستجوی مترادف، هم‌آوا و فرم کلمه پرس‌و‌جو را با استفاده از واژگان داخلی انگلیسی گسترش می‌دهد؛ index.dictionaries به شما امکان ویرایش آن‌ها را می‌دهد و اصلاح املایی و تصحیح طرح‌کلید نیز گزینه‌های جستجو هستند.

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)

برجسته‌سازی موارد یافت‌شده

DocumentHighlighter کل سند را با علامت‌گذاری اصطلاحات یافت‌شده می‌نویسد و FragmentHighlighter فقط بخش‌های اطراف آن‌ها را، به صورت HTML یا متن ساده، در یک فایل، رشته یا شیء فایل باینری می‌نویسد.

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

رویدادهای .NET به عنوان هندلرهای پایتون

هر رویداد ایندکس یک رویداد پایتون است: با += مشترک می‌شوید و با -= لغو اشتراک می‌کنید. یک هندلر می‌تواند یک سند را نادیده بگیرد، با ویژگی‌ها برچسب بزند یا رمز عبور آن را فراهم کند و پیشرفت، خطاها و مراحل فهرست‌گذاری و جستجو را دنبال می‌کند.

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

اشیاء پایتون برای نقاط گسترش موتور

استخراج‌کننده‌های متن سفارشی برای فرمت‌های خودتان، لاگرها، تقسیم‌کننده‌های کلمه، ارائه‌دهندگان فرم کلمه، بارگذارهای سند و اتصال‌دهنده‌های OCR، اشیاء یا توابع ساده پایتون هستند که موتور از طریق رابط‌های خود آن‌ها را فراخوانی می‌کند.

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

به‌روز نگه داشتن فهرست

یک فهرست یک پوشه است: یک‌بار آن را بسازید و در اجرای بعدی باز کنید. update() فقط اسنادی را که از آخرین add() یا update() تغییر کرده‌اند، دوباره فهرست می‌کند، optimize() بخش‌های فهرست را ادغام می‌کند و delete() اسناد را بر اساس مسیر حذف می‌کند.

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

دریافت لایسنس از محیط

GROUPDOCS_LIC_PATH را به مسیر یا URL یک فایل لایسنس تنظیم کنید و لایسنس در اولین فراخوانی به موتور اعمال می‌شود؛ License().set_license(path) همین کار را در کد انجام می‌دهد. لایسنس‌یی که نتواند اعمال شود، از اولین فراخوانی LicenseError را ایجاد می‌کند، به جای بازگشت به حالت ارزیابی. بدون لایسنس، یک فهرست حداکثر ۱۰۰ سند را می‌پذیرد و فقط ۱۰ سند اول یافت‌شدهٔ یک جستجو قابل خواندن است.

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

مثال کد

به بخش‌های «فهرست‌گذاری اسناد و جستجوی آن‌ها»، «جستجوی فازی، مترادف و فرم کلمه»، «برجسته‌سازی موارد یافت‌شده»، «رویدادهای .NET به عنوان هندلرهای پایتون»، «اشیاء پایتون برای نقاط گسترش موتور» و «به‌روز نگه داشتن فهرست» در بالا مراجعه کنید تا مثال‌های کد عملی را ببینید.

نحوه دریافت به‌روزرسانی

PyPI

دانلود مستقیم

چرخ (wheel) مربوط به پلتفرم خود را از صفحهٔ GroupDocs.Search for Python via .NET 26.10 دانلود کنید، سپس فایل را نصب کنید:

  • 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

منابع