Skapa en klient för konsolappsökning i C#

Varning

Den 30 oktober 2020 flyttade Bing-sökning API:er från Azure AI-tjänster till Bing-sökning Services. Den här dokumentationen tillhandahålls endast som referens. Uppdaterad dokumentation finns i dokumentationen för API:et för Bing-sökning. Anvisningar om hur du skapar nya Azure-resurser för Bing-sökning finns i Skapa en Bing-sökning resurs via Azure Marketplace.

Den här självstudien visar hur du skapar en enkel .NET Core-konsolapp som låter användare köra frågor mot API:et för webbsökning i Bing och visa rangordnade resultat.

Den här självstudien visar hur du:

  • Skapa en enkel fråga till API:et för webbsökning i Bing
  • Visa frågeresultat i rangordnad ordning

Förutsättningar

Om du vill följa med i självstudien behöver du:

Skapa ett nytt konsolappprojekt

Skapa ett projekt i Visual Studio med Ctrl+Shift+N.

I dialogrutan Nytt projekt klickar du på Visual C# > Windows Classic Desktop > Console App (.NET Framework).

Ge programmet namnet MyConsoleSearchApp och klicka sedan på OK.

Lägg till JSON.net NuGet-paketet i projektet

JSON.net kan du arbeta med JSON-svar som returneras av API:et. Lägg till dess NuGet-paket i projektet:

  • I Solution Explorer högerklickar du på projektet och väljer Hantera NuGet-paket....
  • På fliken Bläddra söker du efter Newtonsoft.Json. Välj den senaste versionen och klicka sedan på Installera.
  • Klicka på knappen OK i fönstret Granska ändringar .
  • Stäng fliken Visual Studio med rubriken NuGet: MyConsoleSearchApp.

Lägg till en referens till System.Web

Den här självstudien System.Web förlitar sig på sammansättningen. Lägg till en referens till den här sammansättningen i projektet:

  • I Solution Explorer högerklickar du på Referenser och väljer Lägg till referens...
  • Välj Sammansättningsramverk>, rulla sedan nedåt och kontrollera System.Web
  • Välj OK

Lägg till några nödvändiga användningsinstruktioner

Koden i den här självstudien kräver ytterligare tre användningsinstruktioner. Lägg till dessa instruktioner under de befintliga using instruktionerna överst i Program.cs:

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

Be användaren om en fråga

Öppna Program.csi Solution Explorer. Main() Uppdatera metoden:

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();
}

Den här metoden:

  • Frågar användaren om en fråga
  • Anropar RunQueryAndDisplayResults(userQuery) för att köra frågan och visa resultatet
  • Väntar på användarindata för att förhindra att konsolfönstret stängs omedelbart.

Sök efter frågeresultat med api:et för webbsökning i Bing

Lägg sedan till en metod som frågar API:et och visar resultatet:

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

Den här metoden:

  • Skapar en HttpClient för att fråga API:et för webbsökning
  • Ocp-Apim-Subscription-Key Anger HTTP-huvudet, som Bing använder för att autentisera begäran
  • Kör begäran och använder JSON.net för att deserialisera resultatet
  • Anropar DisplayAllRankedResults(responseObjects) för att visa alla resultat i rangordnad ordning

Se till att ange värdet Ocp-Apim-Subscription-Key för till din prenumerationsnyckel.

Visa rangordnade resultat

Innan du visar hur du visar resultaten i rangordnad ordning bör du ta en titt på ett exempel på webbsökningssvar:

{
    "_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"
                }
            }]
        }
    }
}

rankingResponse JSON-objektet (dokumentationen) beskriver lämplig visningsordning för sökresultat. Den innehåller en eller flera av följande prioriterade grupper:

  • pole: Sökresultaten för att få den mest synliga behandlingen (till exempel visas ovanför huvudlinjen och sidofältet).
  • mainline: Sökresultatet som ska visas i huvudraden.
  • sidebar: Sökresultatet som ska visas i sidofältet. Om det inte finns något sidofält visar du resultatet under huvudlinjen.

JSON för rangordningssvar kan innehålla en eller flera av grupperna.

I Program.cs lägger du till följande metod för att visa resultat i korrekt rangordnad ordning:

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;
                }
            }
        }
    }
}

Den här metoden:

  • Loopar över de rankingResponse grupper som svaret innehåller
  • Visar objekten i varje grupp genom att anropa DisplaySpecificResults(...)

Lägg till följande två metoder i 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();
}

Dessa metoder fungerar tillsammans för att mata ut sökresultaten till konsolen.

Kör programmet

Kör appen. Resultatet bör se ut ungefär så här:

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

...

Nästa steg

Läs mer om att använda rangordning för att visa resultat.