Delen via


Een zoekclient voor console-app maken in C#

Waarschuwing

Op 30 oktober 2020 zijn de Zoeken in Bing API's verplaatst van Azure AI-services naar Zoeken in Bing Services. Deze documentatie is alleen bedoeld ter referentie. Zie de bing-documentatie voor zoeken-API voor bijgewerkte documentatie. Zie Een Zoeken in Bing-resource maken via de Azure Marketplace voor instructies over het maken van nieuwe Azure-resources voor Bing Search.

Deze zelfstudie laat zien hoe u een eenvoudige .NET Core-console-app bouwt waarmee gebruikers query's kunnen uitvoeren op de Bing Web Search-API en gerangschikte resultaten kunnen weergeven.

In deze zelfstudie ontdekt u hoe u:

  • Een eenvoudige query verstuurt naar de Bing Web Search-API
  • Queryresultaten weergeeft in gerangschikte volgorde

Vereisten

Als u de zelfstudie wilt volgen, hebt u het volgende nodig:

Een nieuw Console-appproject maken

Maak in Visual Studio een project met Ctrl+Shift+N.

Klik in het dialoogvenster Nieuw project op Visual C# > Klassieke Windows-bureaubladconsole-app > (.NET Framework).

Geef de toepassing de naam myConsoleSearchApp en klik vervolgens op OK.

Het JSON.net NuGet-pakket aan het project toevoegen

Met JSON.net kunt u werken met de JSON-antwoorden die zijn geretourneerd door de API. Voeg het bijbehorende NuGet-pakket toe aan uw project:

  • Klik in Solution Explorer met de rechtermuisknop op het project en klik op NuGet-pakketten beheren… .
  • Zoek op het tabblad Bladeren naar Newtonsoft.Json. Selecteer de nieuwste versie en klik vervolgens op Installeren.
  • Klik op de knop OK in het venster Wijzigingen bekijken.
  • Sluit het Visual Studio-tabblad met de titel NuGet: MyConsoleSearchApp.

Een verwijzing naar System.Web toevoegen

In deze zelfstudie wordt gebruikgemaakt van de System.Web-assembly. Voeg een verwijzing toe naar deze assembly aan uw project:

  • Klik in Solution Explorer met de rechtermuisknop op Verwijzingen en selecteer Verwijzing toevoegen… .
  • Selecteer Assemblyies > Framework, schuif omlaag en controleer System.Web
  • Selecteer OK

Enkele vereiste instructies toevoegen

Voor de code in deze zelfstudie zijn drie extra instructies vereist. Voeg deze instructies toe onder de bestaande using-instructies bovenaan Program.cs:

using System.Web;
using System.Net.Http;

De gebruiker vragen om een query

In Solution Explorer opent u Program.cs. Werk de Main()-methode bij:

static void Main()
{
    // Get the user's query
    Console.Write("Enter Bing query: ");
    string userQuery = Console.ReadLine();
    Console.WriteLine();

    // Run the query and display the results
    RunQueryAndDisplayResults(userQuery);

    // Prevent the console window from closing immediately
    Console.WriteLine("\nHit ENTER to exit...");
    Console.ReadLine();
}

Deze methode:

  • De gebruiker wordt gevraagd om een query
  • Roept RunQueryAndDisplayResults(userQuery) aan om de query uit te voeren en de resultaten weer te geven
  • Wacht op invoer van de gebruiker om te voorkomen dat het consolevenster onmiddellijk wordt gesloten.

Zoeken naar queryresultaten met behulp van de Bing Web Search-API

Voeg vervolgens een methode toe waarmee query's worden uitgevoerd op de API en de resultaten worden weergegeven:

static void RunQueryAndDisplayResults(string userQuery)
{
    try
    {
        // Create a query
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "<YOUR_SUBSCRIPTION_KEY_GOES_HERE>");
        var queryString = HttpUtility.ParseQueryString(string.Empty);
        queryString["q"] = userQuery;
        var query = "https://api.cognitive.microsoft.com/bing/v7.0/search?" + queryString;

        // Run the query
        HttpResponseMessage httpResponseMessage = client.GetAsync(query).Result;

        // Deserialize the response content
        var responseContentString = httpResponseMessage.Content.ReadAsStringAsync().Result;
        Newtonsoft.Json.Linq.JObject responseObjects = Newtonsoft.Json.Linq.JObject.Parse(responseContentString);

        // Handle success and error codes
        if (httpResponseMessage.IsSuccessStatusCode)
        {
            DisplayAllRankedResults(responseObjects);
        }
        else
        {
            Console.WriteLine($"HTTP error status code: {httpResponseMessage.StatusCode.ToString()}");
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Deze methode:

  • Hiermee maakt u een HttpClient om query's uit te voeren op de Web Search-API
  • Hiermee stelt u de Ocp-Apim-Subscription-Key HTTP-header in die door Bing wordt gebruikt om de aanvraag te verifiëren
  • Voert de aanvraag uit en gebruikt JSON.net om de resultaten te deserialiseren
  • Roept DisplayAllRankedResults(responseObjects) aan om alle resultaten in de gerangschikte volgorde weer te geven

Zorg ervoor dat u de waarde van Ocp-Apim-Subscription-Key instelt op de sleutel van uw abonnement.

Gerangschikte resultaten weergeven

Bekijk een voorbeeld van een reactie op een webzoekopdracht voordat u kijkt naar hoe de resultaten in gerangschikte volgorde kunnen worden weergegeven:

{
    "_type" : "SearchResponse",
    "webPages" : {
        "webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346...",
        "totalEstimatedMatches" : 982000,
        "value" : [{
            "id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0",
            "name" : "Contoso Sailing Club - Seattle",
            "url" : "https:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
            "displayUrl" : "https:\/\/contososailingsea...",
            "snippet" : "Come sail with Contoso in Seattle...",
            "dateLastCrawled" : "2017-04-07T02:25:00"
        },
        {
            "id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#WebPages.6",
            "name" : "Contoso Sailing Lessons - Official Site",
            "url" : "http:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
            "displayUrl" : "https:\/\/www.constososailinglessonsseat...",
            "snippet" : "Contoso sailing lessons in Seattle...",
            "dateLastCrawled" : "2017-04-09T14:30:00"
        },

        ...

        ],
        "someResultsRemoved" : true
    },
    "relatedSearches" : {
        "id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#RelatedSearches",
        "value" : [{
            "text" : "sailing lessons",
            "displayText" : "sailing lessons",
            "webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346E..."
        }

        ...

        ]
    },
    "rankingResponse" : {
        "mainline" : {
            "items" : [{
                "answerType" : "WebPages",
                "resultIndex" : 0,
                "value" : {
                    "id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0"
                }
            },
            {
                "answerType" : "WebPages",
                "resultIndex" : 1,
                "value" : {
                    "id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.1"
                }
            }

            ...

            ]
        },
        "sidebar" : {
            "items" : [{
                "answerType" : "RelatedSearches",
                "value" : {
                    "id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#RelatedSearches"
                }
            }]
        }
    }
}

In het rankingResponse JSON-object (documentatie) wordt de juiste weergavevolgorde voor zoekresultaten beschreven. Het bevat een of meer van de volgende groepen met prioriteit:

  • pole: De zoekresultaten voor het verkrijgen van de meest zichtbare behandeling (bijvoorbeeld weergegeven boven de mainline en navigatiekolom).
  • mainline: De zoekresultaten worden weergegeven in de mainline.
  • sidebar: De zoekresultaten worden weergegeven in de navigatiekolom. Als er geen navigatiekolom is, geeft u de resultaten onder de mainline weer.

De JSON van het classificatie-antwoord kan een of meer van de groepen bevatten.

Voeg in Program.cs de volgende methode toe om de resultaten weer te geven in de juiste volgorde:

static void DisplayAllRankedResults(Newtonsoft.Json.Linq.JObject responseObjects)
{
    string[] rankingGroups = new string[] { "pole", "mainline", "sidebar" };

    // Loop through the ranking groups in priority order
    foreach (string rankingName in rankingGroups)
    {
        Newtonsoft.Json.Linq.JToken rankingResponseItems = responseObjects.SelectToken($"rankingResponse.{rankingName}.items");
        if (rankingResponseItems != null)
        {
            foreach (Newtonsoft.Json.Linq.JObject rankingResponseItem in rankingResponseItems)
            {
                Newtonsoft.Json.Linq.JToken resultIndex;
                rankingResponseItem.TryGetValue("resultIndex", out resultIndex);
                var answerType = rankingResponseItem.Value<string>("answerType");
                switch (answerType)
                {
                    case "WebPages":
                        DisplaySpecificResults(resultIndex, responseObjects.SelectToken("webPages.value"), "WebPage", "name", "url", "displayUrl", "snippet");
                        break;
                    case "News":
                        DisplaySpecificResults(resultIndex, responseObjects.SelectToken("news.value"), "News", "name", "url", "description");
                        break;
                    case "Images":
                        DisplaySpecificResults(resultIndex, responseObjects.SelectToken("images.value"), "Image", "thumbnailUrl");
                        break;
                    case "Videos":
                        DisplaySpecificResults(resultIndex, responseObjects.SelectToken("videos.value"), "Video", "embedHtml");
                        break;
                    case "RelatedSearches":
                        DisplaySpecificResults(resultIndex, responseObjects.SelectToken("relatedSearches.value"), "RelatedSearch", "displayText", "webSearchUrl");
                        break;
                }
            }
        }
    }
}

Deze methode:

  • Lussen over de rankingResponse-groepen die het antwoord bevat
  • De items in elke groep worden weergegeven door DisplaySpecificResults(...) aan te roepen

Voeg de volgende twee methoden toe in Program.cs:

static void DisplaySpecificResults(Newtonsoft.Json.Linq.JToken resultIndex, Newtonsoft.Json.Linq.JToken items, string title, params string[] fields)
{
    if (resultIndex == null)
    {
        foreach (Newtonsoft.Json.Linq.JToken item in items)
        {
            DisplayItem(item, title, fields);
        }
    }
    else
    {
        DisplayItem(items.ElementAt((int)resultIndex), title, fields);
    }
}

static void DisplayItem(Newtonsoft.Json.Linq.JToken item, string title, string[] fields)
{
    Console.WriteLine($"{title}: ");
    foreach( string field in fields )
    {
        Console.WriteLine($"- {field}: {item[field]}");
    }
    Console.WriteLine();
}

Deze methoden werken samen om de zoekresultaten uit te voeren naar de console.

De toepassing uitvoeren

Voer de toepassing uit. De uitvoer moet er als volgt uitzien:

Enter Bing query: sailing lessons seattle

WebPage:
- name: Contoso Sailing Club - Seattle
- url: https://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://contososailingsea....
- snippet: Come sail with Contoso in Seattle...

WebPage:
- name: Contoso Sailing Lessons Seattle - Official Site
- url: http://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://www.constososailinglessonsseat...
- snippet: Contoso sailing lessons in Seattle...

...

Volgende stappen

Meer informatie over classificatie gebruiken om resultaten weer te geven.