Sestavení klienta vyhledávání konzolové aplikace v jazyce C#

Upozornění

30. října 2020 se rozhraní API Vyhledávání Bingu přesunula ze služeb Azure AI na Vyhledávání Bingu Services. Tato dokumentace je k dispozici pouze pro referenci. Aktualizovanou dokumentaci najdete v dokumentaci k rozhraní API bingu pro vyhledávání. Pokyny k vytváření nových prostředků Azure pro vyhledávání Bingem najdete v tématu Vytvoření prostředku Vyhledávání Bingu prostřednictvím Azure Marketplace.

V tomto kurzu se dozvíte, jak vytvořit jednoduchou konzolovou aplikaci .NET Core, která uživatelům umožní dotazovat se na rozhraní API Bingu pro vyhledávání na webu a zobrazit seřazené výsledky.

V tomto kurzu se dozvíte, jak:

  • Vytvoření jednoduchého dotazu na rozhraní API Bingu pro vyhledávání na webu
  • Zobrazení výsledků dotazu v seřazeném pořadí

Požadavky

Pokud chcete postupovat podle tohoto kurzu, potřebujete:

Vytvoření nového projektu konzolové aplikace

V sadě Visual Studio vytvořte projekt pomocí Ctrl+Shift+N.

V dialogovém okně Nový projekt klikněte na Visual C# > Klasické desktopové konzolové > aplikace pro Windows (.NET Framework).

Pojmenujte aplikaci MyConsoleSearchApp a klikněte na OK.

Přidání balíčku NuGet JSON.net do projektu

JSON.net umožňuje pracovat s odpověďmi JSON vrácenými rozhraním API. Přidejte do projektu jeho balíček NuGet:

  • V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet....
  • Na kartě Procházet vyhledejte Newtonsoft.Json. Vyberte nejnovější verzi a klikněte na Nainstalovat.
  • Klikněte na tlačítko OK v okně Zkontrolovat změny .
  • Zavřete kartu Sady Visual Studio s názvem NuGet: MyConsoleSearchApp.

Přidání odkazu na System.Web

Tento kurz se spoléhá na System.Web sestavení. Přidejte odkaz na toto sestavení do projektu:

  • V Průzkumník řešení klikněte pravým tlačítkem na Odkazy a vyberte Přidat odkaz...
  • Vyberte Sestavení > Framework, posuňte se dolů a zkontrolujte System.Web.
  • Vyberte OK.

Přidání některých nezbytných příkazů using

Kód v tomto kurzu vyžaduje tři další příkazy using. Pod existující using příkazy v horní části souboru Program.cs přidejte tyto příkazy:

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

Požádejte uživatele o dotaz.

V Průzkumník řešení otevřete Program.cs. Aktualizujte metodu Main() :

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

Tato metoda:

  • Požádá uživatele o dotaz.
  • Volání RunQueryAndDisplayResults(userQuery) ke spuštění dotazu a zobrazení výsledků
  • Čeká na uživatelský vstup, aby se zabránilo okamžitému zavření okna konzoly.

Hledání výsledků dotazu pomocí rozhraní API Bingu pro vyhledávání na webu

Dále přidejte metodu, která dotazuje rozhraní API a zobrazí výsledky:

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

Tato metoda:

  • Vytvoří dotaz HttpClient na rozhraní API pro vyhledávání na webu.
  • Nastaví hlavičku Ocp-Apim-Subscription-Key HTTP, kterou Bing používá k ověření požadavku.
  • Spustí požadavek a použije JSON.net k deserializaci výsledků.
  • Volání DisplayAllRankedResults(responseObjects) pro zobrazení všech výsledků v seřazeném pořadí

Nezapomeňte nastavit hodnotu Ocp-Apim-Subscription-Key na klíč předplatného.

Zobrazit seřazené výsledky

Než ukážete, jak zobrazit výsledky v seřazeném pořadí, podívejte se na ukázkovou odpověď webového vyhledávání:

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

Objekt rankingResponse JSON (dokumentace) popisuje odpovídající pořadí zobrazení pro výsledky hledání. Zahrnuje jednu nebo více následujících skupin s prioritou:

  • pole: Výsledky hledání pro získání nejviditelnější léčby (například zobrazené nad hlavní linkou a bočním panelem).
  • mainline: Výsledky hledání, které se mají zobrazit na hlavním řádku.
  • sidebar: Výsledky hledání, které se zobrazí na bočním panelu. Pokud není k dispozici žádný boční panel, zobrazte výsledky pod hlavní linkou.

Json odpovědi na řazení může obsahovat jednu nebo více skupin.

V souboru Program.cs přidejte následující metodu pro zobrazení výsledků ve správném pořadí:

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

Tato metoda:

  • Smyčky nad skupinami rankingResponse , které odpověď obsahuje
  • Zobrazí položky v každé skupině voláním. DisplaySpecificResults(...)

V souboru Program.cs přidejte následující dvě metody:

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

Tyto metody spolupracují na výstupu výsledků hledání do konzoly.

Spuštění aplikace

Spusťte aplikaci. Výstup by měl vypadat nějak takto:

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

...

Další kroky

Přečtěte si další informace o použití řazení k zobrazení výsledků.