التشغيل السريع: البحث عن النص الكامل باستخدام Azure SDKs

تعرف على كيفية استخدام مكتبة عميل Azure.Search.Documents في Azure SDK لإنشاء فهرس بحث وتحميله والاستعلام منه باستخدام بيانات نموذجية للبحث الكامل عن النص. يستخدم البحث عن النص الكامل Apache Lucene للفهرسة والاستعلامات، وخوارزمية ترتيب BM25 لتسجيل النتائج.

يحتوي هذا التشغيل السريع على خطوات ل SDKs التالية:

المتطلبات الأساسية

  • حساب Azure مع اشتراك نشط. أنشئ حساباً مجاناً.

  • الذكاء الاصطناعي خدمة البحث Azure. إنشاء خدمة إذا لم يكن لديك خدمة. يمكنك استخدام طبقة مجانية لهذا التشغيل السريع.

  • مفتاح API ونقطة نهاية الخدمة. سجل الدخول إلى مدخل Microsoft Azure وابحث عن خدمة البحث.

    في نظرة عامة، انسخ عنوان URL واحفظه في المفكرة لخطوة لاحقة. قد يبدو مثال نقطة النهاية بالشكل https://mydemo.search.windows.net.

    في المفاتيح، انسخ مفتاح مسؤول واحفظه للحصول على الحقوق الكاملة لإنشاء الكائنات وحذفها. هناك نوعان من المفاتيح الأساسية والثانوية القابلة للتبديل. اختر أيا منهما.

    الحصول على نقطة انتهاء HTTP ومفتاح الوصول

إنشاء فهرس وتحميله والاستعلام فيه

اختر لغة برمجة للخطوة التالية. تتوفر مكتبات عميل Azure.Search.Documents في Azure SDKs ل .NET وPython وJava وJavaScript.

إنشاء تطبيق وحدة تحكم باستخدام مكتبة عميل Azure.Search.Documents لإنشاء فهرس بحث وتحميله والاستعلام فيه. بدلا من ذلك، يمكنك تنزيل التعليمات البرمجية المصدر للبدء بمشروع منته أو اتباع هذه الخطوات لإنشاء التعليمات البرمجية الخاصة بك.

إعداد بيئتك

  1. ابدأ تشغيل Visual Studio وأنشئ مشروعا جديدا لتطبيق وحدة تحكم.

  2. في أدوات>مدير حزمة NuGet، حدد إدارة حزم للحلول....

  3. حدد استعراض.

  4. ابحث عن حزمة Azure.Search.Documents وحدد الإصدار 11.0 أو أحدث.

  5. حدد تثبيت على اليمين لإضافة التجميع إلى المشروع والحل.

إنشاء عميل بحث

  1. في Program.cs، غيّر مساحة الاسم إلى AzureSearch.SDK.Quickstart.v11 ثم أضف التوجيهات using التالية.

    using Azure;
    using Azure.Search.Documents;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    using Azure.Search.Documents.Models;
    
  2. أنشئ عميلين: SearchIndexClient الذي ينشئ الفهرس وSearchClient الذي يحمّل فهرسًا حاليًّا ويستعلم عنه. يحتاج كلاهما إلى نقطة نهاية الخدمة ومفتاح واجهة برمجة تطبيقات مسؤول للمصادقة مع حقوق الإنشاء/الحذف.

    نظرا لأن التعليمات البرمجية تنشئ URI نيابة عنك، حدد اسم خدمة البحث فقط في الخاصية "serviceName".

     static void Main(string[] args)
     {
         string serviceName = "<your-search-service-name>";
         string apiKey = "<your-search-service-admin-api-key>";
         string indexName = "hotels-quickstart";
    
         // Create a SearchIndexClient to send create/delete index commands
         Uri serviceEndpoint = new Uri($"https://{serviceName}.search.windows.net/");
         AzureKeyCredential credential = new AzureKeyCredential(apiKey);
         SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, credential);
    
         // Create a SearchClient to load and query documents
         SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, credential);
         . . . 
     }
    

إنشاء فهرس

ينشئ دليل التشغيل السريع هذا فهرس "فنادق" ستقوم بتحميله ببيانات الفندق وتنفيذ الاستعلامات عنه. في هذه الخطوة، حدد الحقول في الفهرس. يتضمن كل تعريف حقل اسمًا، ونوع بيانات وسمات تحدد كيفية استخدام الحقل.

في هذا المثال، يتم استخدام أساليب متزامنة من مكتبة Azure.Search.Documents من أجل البساطة وقابلية القراءة. ومع ذلك، بالنسبة لسيناريوهات الإنتاج، يجب استخدام أساليب غير متزامنة للحفاظ على التطبيق قابلاً للتطوير والاستجابة. على سبيل المثال، يمكنك استخدام CreateIndexAsync بدلاً من CreateIndex.

  1. إضافة تعريف فئة فارغة إلى المشروع الخاص بك: Hotel.cs

  2. انسخ التعليمات البرمجية التالية إلى Hotel.cs لتعريف بنية مستند الفندق. تحدد السمات الموجودة في الحقل كيفية استخدامه في أحد التطبيقات. على سبيل المثال، يجب تعيين السمة IsFilterable إلى كل حقل يدعم تعبير عامل تصفية.

    using System;
    using System.Text.Json.Serialization;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    
    namespace AzureSearch.Quickstart
    {
        public partial class Hotel
        {
            [SimpleField(IsKey = true, IsFilterable = true)]
            public string HotelId { get; set; }
    
            [SearchableField(IsSortable = true)]
            public string HotelName { get; set; }
    
            [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
            public string Description { get; set; }
    
            [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
            [JsonPropertyName("Description_fr")]
            public string DescriptionFr { get; set; }
    
            [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public string Category { get; set; }
    
            [SearchableField(IsFilterable = true, IsFacetable = true)]
            public string[] Tags { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public bool? ParkingIncluded { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public DateTimeOffset? LastRenovationDate { get; set; }
    
            [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
            public double? Rating { get; set; }
    
            [SearchableField]
            public Address Address { get; set; }
        }
    }
    

    في مكتبة عميل Azure.Search.Documents، يمكنك استخدام SearchableField وSimpleField لتبسيط تعريفات الحقول. كلاهما مشتقات من SearchField ويمكن أن تبسط التعليمات البرمجية الخاصة بك:

    • يمكن لـ SimpleField أن يكون أي نوع من البيانات، فهو دائمًا غير قابل للبحث (يتم تجاهله لاستعلامات البحث عن النص الكامل)، ويمكن استرداده (ليس مخفيًا). يتم إيقاف السمات الأخرى بشكل افتراضي، ولكن يمكن تمكينها. يمكنك استخدام SimpleField لمعرّفات المستندات أو الحقول المستخدمة فقط في عوامل التصفية، أو الواجهات أو ملفات تعريف التسجيل. إذا كان الأمر كذلك، فتأكد من تطبيق أي سمات ضرورية للسيناريو، مثل IsKey = true لمعرّف مستند. للحصول على مزيد من المعلومات، راجع SimpleFieldAttribute.cs في التعليمات البرمجية المصدر.

    • يجب أن تكون SearchableField سلسلة، وأن تكون قابلة دائمًا للبحث والاسترداد. يتم إيقاف السمات الأخرى بشكل افتراضي، ولكن يمكن تمكينها. لأن هذا النوع من الحقول قابل للبحث، فإنه يدعم المرادفات والملحق الكامل لخصائص المحلل. للحصول على مزيد من المعلومات، راجع SearchableFieldAttribute.cs في التعليمات البرمجية المصدر.

    سواء كنت تستخدم واجهة برمجة تطبيقات SearchField الأساسية أو أحد النماذج المساعدة، يجب تمكين عوامل التصفية، والواجهة وفرز السمات بشكل صريح. على سبيل المثال، يجب تعيين سمة لـ IsFilterable، وIsSortable وIsFacetable بشكل صريح، كما هو موضح في النموذج أعلاه.

  3. أضف تعريف فئة فارغة إلى المشروع الخاص بك: Address.cs. انسخ التعليمة البرمجية التالية في الفئة.

    using Azure.Search.Documents.Indexes;
    
     namespace AzureSearch.Quickstart
     {
         public partial class Address
         {
             [SearchableField(IsFilterable = true)]
             public string StreetAddress { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string City { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string StateProvince { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string PostalCode { get; set; }
    
             [SearchableField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
             public string Country { get; set; }
         }
     }
    
  4. أنشئ فئتين إضافيتين: Hotel.Methods.cs وAddress.Methods.cs لتجاوزات ToString(). يتم استخدام هذه الفئات لتقديم نتائج البحث في إخراج وحدة التحكم. لا يتم توفير محتويات هذه الفئات في هذه المقالة، ولكن يمكنك نسخ التعليمات البرمجية من الملفات في GitHub.

  5. في Program.cs، أنشئ كائن SearchIndex، ثم استدعِ الأسلوب CreateIndex للتعبير عن الفهرس في خدمة البحث. يتضمن الفهرس أيضًا SearchSuggester لتمكين الإكمال التلقائي في الحقول المحددة.

     // Create hotels-quickstart index
     private static void CreateIndex(string indexName, SearchIndexClient adminClient)
     {
         FieldBuilder fieldBuilder = new FieldBuilder();
         var searchFields = fieldBuilder.Build(typeof(Hotel));
    
         var definition = new SearchIndex(indexName, searchFields);
    
         var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
         definition.Suggesters.Add(suggester);
    
         adminClient.CreateOrUpdateIndex(definition);
     }
    

تحميل المستندات

يبحث Azure الذكاء الاصطناعي Search عن المحتوى المخزن في الخدمة. في هذه الخطوة، ستقوم بتحميل مستندات JSON التي تتوافق مع فهرس الفندق الذي أنشأته للتوّ.

في Azure الذكاء الاصطناعي Search، تكون مستندات البحث هي بنيات بيانات هي مدخلات للفهرسة والمخرجات من الاستعلامات. نظرًا للحصول عليها من مصدر بيانات خارجي، قد تكون مدخلات المستند صفوفًا في قاعدة بيانات، أو كائنات ثنائية كبيرة الحجم في تخزين Blob أو مستندات JSON على القرص. في هذا المثال، نحن نتخذ اختصارًا وندمج مستندات JSON لأربعة فنادق في التعليمات البرمجية نفسها.

عند تحميل المستندات، يجب استخدام كائن IndexDocumentsBatch. IndexDocumentsBatch يحتوي الكائن على مجموعة من الإجراءات، يحتوي كل منها على مستند وخاصية تخبر Azure الذكاء الاصطناعي البحث عن الإجراء الذي يجب تنفيذه (التحميل والدمج والحذف والدمجOrUpload).

  1. في Program.cs، أنشئ صفيفًا من المستندات وإجراءات الفهرس، ثم مرّر الصفيف إلى IndexDocumentsBatch. تتوافق الوثائق أدناه مع فهرس التشغيل السريع للفنادق، كما هو محدّد من قبل فئة الفندق.

    // Upload documents in a single Upload request.
    private static void UploadDocuments(SearchClient searchClient)
    {
        IndexDocumentsBatch<Hotel> batch = IndexDocumentsBatch.Create(
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    HotelId = "1",
                    HotelName = "Secret Point Motel",
                    Description = "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
                    DescriptionFr = "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
                    Category = "Boutique",
                    Tags = new[] { "pool", "air conditioning", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate = new DateTimeOffset(1970, 1, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.6,
                    Address = new Address()
                    {
                        StreetAddress = "677 5th Ave",
                        City = "New York",
                        StateProvince = "NY",
                        PostalCode = "10022",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    HotelId = "2",
                    HotelName = "Twin Dome Motel",
                    Description = "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
                    DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
                    Category = "Boutique",
                    Tags = new[] { "pool", "free wifi", "concierge" },
                    ParkingIncluded = false,
                    LastRenovationDate = new DateTimeOffset(1979, 2, 18, 0, 0, 0, TimeSpan.Zero),
                    Rating = 3.60,
                    Address = new Address()
                    {
                        StreetAddress = "140 University Town Center Dr",
                        City = "Sarasota",
                        StateProvince = "FL",
                        PostalCode = "34243",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    HotelId = "3",
                    HotelName = "Triple Landscape Hotel",
                    Description = "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
                    DescriptionFr = "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
                    Category = "Resort and Spa",
                    Tags = new[] { "air conditioning", "bar", "continental breakfast" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(2015, 9, 20, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.80,
                    Address = new Address()
                    {
                        StreetAddress = "3393 Peachtree Rd",
                        City = "Atlanta",
                        StateProvince = "GA",
                        PostalCode = "30326",
                        Country = "USA"
                    }
                }),
            IndexDocumentsAction.Upload(
                new Hotel()
                {
                    HotelId = "4",
                    HotelName = "Sublime Cliff Hotel",
                    Description = "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
                    DescriptionFr = "Le sublime Cliff Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Cliff fait partie d'un Palace 1800 restauré avec amour.",
                    Category = "Boutique",
                    Tags = new[] { "concierge", "view", "24-hour front desk service" },
                    ParkingIncluded = true,
                    LastRenovationDate = new DateTimeOffset(1960, 2, 06, 0, 0, 0, TimeSpan.Zero),
                    Rating = 4.60,
                    Address = new Address()
                    {
                        StreetAddress = "7400 San Pedro Ave",
                        City = "San Antonio",
                        StateProvince = "TX",
                        PostalCode = "78216",
                        Country = "USA"
                    }
                })
            );
    
        try
        {
            IndexDocumentsResult result = searchClient.IndexDocuments(batch);
        }
        catch (Exception)
        {
            // If for some reason any documents are dropped during indexing, you can compensate by delaying and
            // retrying. This simple demo just logs the failed document keys and continues.
            Console.WriteLine("Failed to index some of the documents: {0}");
        }
    }
    

    بمجرد تهيئة كائن IndexDocumentsBatch، يمكنك إرساله إلى الفهرس عن طريق استدعاء IndexDocuments على كائن SearchClient الخاص بك.

  2. أضف الأسطر التالية إلى Main(). يتم تحميل المستندات باستخدام SearchClient، ولكن تتطلب العملية أيضًا حقوق المسؤول في الخدمة، والتي عادةً ما تكون مقترنة بـ SearchIndexClient. إحدى الطرق لإعداد هذه العملية هي الحصول على SearchClient من خلال SearchIndexClient (adminClient في هذا المثال).

     SearchClient ingesterClient = adminClient.GetSearchClient(indexName);
    
     // Load documents
     Console.WriteLine("{0}", "Uploading documents...\n");
     UploadDocuments(ingesterClient);
    
  3. نظرًا لأن هذا التطبيق هو تطبيق وحدة تحكم يقوم بتشغيل كافة الأوامر بشكل تسلسلي، أضف فترة انتظار لمدة ثانيتين بين الفهرسة والاستعلامات.

    // Wait 2 seconds for indexing to complete before starting queries (for demo and console-app purposes only)
    Console.WriteLine("Waiting for indexing...\n");
    System.Threading.Thread.Sleep(2000);
    

    التأخير عن ثانيتين يعوّض الفهرسة، التي تكون غير متزامنة، بحيث يمكن فهرسة كافة المستندات قبل تنفيذ الاستعلامات. عادةً ما يكون الترميز المتأخر ضروريًا فقط في العروض التوضيحية، والاختبارات ونماذج التطبيقات.

البحث في فهرس

يمكنك الحصول على نتائج الاستعلام بمجرد فهرسة المستند الأول، ولكن يجب أن ينتظر الاختبار الفعلي للفهرس حتى تتم فهرسة كافة المستندات.

يضيف هذا القسم قطعتين من الوظائف: منطق الاستعلام والنتائج. للاستعلامات، استخدم الأسلوب بحث. يأخذ هذا الأسلوب نص البحث (سلسلة الاستعلام) وخيارات أخرى.

تمثل الفئة SearchResults النتائج.

  1. في Program.cs، أنشئ أسلوب WriteDocuments الذي يطبع نتائج البحث إلى وحدة التحكم.

    // Write search results to console
    private static void WriteDocuments(SearchResults<Hotel> searchResults)
    {
        foreach (SearchResult<Hotel> result in searchResults.GetResults())
        {
            Console.WriteLine(result.Document);
        }
    
        Console.WriteLine();
    }
    
    private static void WriteDocuments(AutocompleteResults autoResults)
    {
        foreach (AutocompleteItem result in autoResults.Results)
        {
            Console.WriteLine(result.Text);
        }
    
        Console.WriteLine();
    }
    
  2. أنشئ أسلوب RunQueries لتنفيذ الاستعلامات واسترداد النتائج. النتائج هي كائنات "الفندق". يعرض هذا النموذج توقيع الأسلوب والاستعلام الأول. يوضح هذا الاستعلام المعلمة "تحديد" التي تتيح لك إنشاء النتيجة باستخدام الحقول المحددة من المستند.

    // Run queries, use WriteDocuments to print output
    private static void RunQueries(SearchClient srchclient)
    {
        SearchOptions options;
        SearchResults<Hotel> response;
    
        // Query 1
        Console.WriteLine("Query #1: Search on empty term '*' to return all documents, showing a subset of fields...\n");
    
        options = new SearchOptions()
        {
            IncludeTotalCount = true,
            Filter = "",
            OrderBy = { "" }
        };
    
        options.Select.Add("HotelId");
        options.Select.Add("HotelName");
        options.Select.Add("Address/City");
    
        response = srchclient.Search<Hotel>("*", options);
        WriteDocuments(response);
    
  3. في الاستعلام الثاني، ابحث عن مصطلح، وأضف عامل تصفية يحدد المستندات التي يزيد فيها التصنيف عن 4، ثم قم بالفرز حسب التصنيف بترتيب تنازلي. إن عامل التصفية هو تعبير منطقي يتم تقييمه عبر حقول IsFilterable في فهرس. تتضمن استعلامات التصفية القيم أو تستبعدها. على هذا النحو، لا توجد درجة صلة مقترنة باستعلام عامل تصفية.

    // Query 2
    Console.WriteLine("Query #2: Search on 'hotels', filter on 'Rating gt 4', sort by Rating in descending order...\n");
    
    options = new SearchOptions()
    {
        Filter = "Rating gt 4",
        OrderBy = { "Rating desc" }
    };
    
    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Rating");
    
    response = srchclient.Search<Hotel>("hotels", options);
    WriteDocuments(response);
    
  4. يوضح الاستعلام الثالث searchFields، المستخدمة لتحديد نطاق عملية البحث بنص كامل في حقول معينة.

    // Query 3
    Console.WriteLine("Query #3: Limit search to specific fields (pool in Tags field)...\n");
    
    options = new SearchOptions()
    {
        SearchFields = { "Tags" }
    };
    
    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Tags");
    
    response = srchclient.Search<Hotel>("pool", options);
    WriteDocuments(response);
    
  5. يوضح الاستعلام الرابع الواجهات، التي يمكن استخدامها لهيكلة بنية تنقل حسب الواجهات.

     // Query 4
     Console.WriteLine("Query #4: Facet on 'Category'...\n");
    
     options = new SearchOptions()
     {
         Filter = ""
     };
    
     options.Facets.Add("Category");
    
     options.Select.Add("HotelId");
     options.Select.Add("HotelName");
     options.Select.Add("Category");
    
     response = srchclient.Search<Hotel>("*", options);
     WriteDocuments(response);
    
  6. في الاستعلام الخامس، أعد مستندًا معينًا. البحث عن مستند هو استجابة نموذجية إلى الحدث OnClick في مجموعة نتائج.

     // Query 5
     Console.WriteLine("Query #5: Look up a specific document...\n");
    
     Response<Hotel> lookupResponse;
     lookupResponse = srchclient.GetDocument<Hotel>("3");
    
     Console.WriteLine(lookupResponse.Value.HotelId);
    
  7. يُظهر الاستعلام الأخير بناء الجملة للإكمال التلقائي، حيث يحاكي إدخال مستخدم جزئي من "sa" الذي يحل إلى اثنين من التطابقات المحتملة في sourceFields المقترنة مع الاقتراح الذي قمت بتحديده في الفهرس.

     // Query 6
     Console.WriteLine("Query #6: Call Autocomplete on HotelName that starts with 'sa'...\n");
    
     var autoresponse = srchclient.Autocomplete("sa", "sg");
     WriteDocuments(autoresponse);
    
  8. أضف RunQueries إلى Main().

    // Call the RunQueries method to invoke a series of queries
    Console.WriteLine("Starting queries...\n");
    RunQueries(srchclient);
    
    // End the program
    Console.WriteLine("{0}", "Complete. Press any key to end this program...\n");
    Console.ReadKey();
    

تعرض الاستعلامات السابقة طرقًا متعددة لمطابقة المصطلحات في استعلام: البحث بنص كامل، وعوامل التصفية والإكمال التلقائي.

يتم تنفيذ البحث بنص كامل وعوامل التصفية باستخدام أسلوب SearchClient.Search. يمكن تمرير استعلام بحث في السلسلة searchText، بينما يمكن تمرير تعبير عامل تصفية في خاصية عامل التصفية لفئة SearchOptions. للتصفية دون البحث، فقط مرّر "*" للمعلمة searchText في أسلوب البحث. للبحث دون تصفية، اترك الخاصية Filter غير معينة، أو لا تمر في مثيل SearchOptions على الإطلاق.

قم بتشغيل البرنامج.

اضغط على F5 لإعادة إنشاء التطبيق وتشغيل البرنامج بالكامل.

يتضمن الإخراج رسائل من Console.WriteLine، مع إضافة معلومات الاستعلام والنتائج.

تنظيف الموارد

عندما تعمل على اشتراكك الخاص، من الأفضل أن تُحدد في نهاية المشروع ما إذا كنت لا تزال بحاجة إلى الموارد التي أنشأتها أو لا. الموارد المتبقية قيد التشغيل يمكن أن تكلفك المال. يمكنك حذف الموارد بشكل فردي أو حذف مجموعة الموارد لحذف تشكيلة الموارد بأكملها.

يمكن العثور على الموارد وإدارتها في المدخل الإلكتروني، باستخدامAll resources أو رابط Resource groups الموجود في جزء التنقل الأيسر.

إذا كنت تستخدم خدمة مجانية، فتذكر أنك تقتصر على ثلاثة فهارس ومفهرسات ومصادر بيانات. يمكنك حذف العناصر الفردية في المدخل لعدم تجاوز الحد المسموح به.

الخطوات التالية

في هذا التشغيل السريع، عملت من خلال مجموعة من المهام لإنشاء فهرس وتحميله بالمستندات وتشغيل الاستعلامات. في مراحل مختلفة، اتخذنا اختصارات لتبسيط التعليمات البرمجية لسهولة القراءة والفهم. الآن بعد أن أصبحت على دراية بالمفاهيم الأساسية، جرب برنامج تعليمي يستدعي واجهات برمجة تطبيقات Azure الذكاء الاصطناعي Search في تطبيق ويب.