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:
- Předplatné Azure – Vytvořte si ho zdarma.
- Jakmile budete mít předplatné Azure, Vyhledávání Bingu v Azure Portal, abyste získali klíč a koncový bod. Po nasazení klikněte na Přejít k prostředku.
- Integrované vývojové prostředí sady Visual Studio.
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ů.