Udostępnij za pośrednictwem


Tworzenie klienta wyszukiwania aplikacji konsolowej w języku C#

Ostrzeżenie

30 października 2020 r. interfejsy API Wyszukiwanie Bing zostały przeniesione z usług Azure AI do usług Wyszukiwanie Bing Services. Ta dokumentacja jest udostępniana tylko do celów referencyjnych. Aby uzyskać zaktualizowaną dokumentację, zobacz dokumentację interfejsu API wyszukiwania Bing. Aby uzyskać instrukcje dotyczące tworzenia nowych zasobów platformy Azure na potrzeby wyszukiwania Bing, zobacz Tworzenie zasobu Wyszukiwanie Bing za pośrednictwem Azure Marketplace.

W tym samouczku pokazano, jak utworzyć prostą aplikację konsolową platformy .NET Core, która umożliwia użytkownikom wykonywanie zapytań względem interfejsu API wyszukiwania w Internecie Bing i wyświetlanie sklasyfikowanych wyników.

W tym samouczku pokazano, jak:

  • Tworzenie prostego zapytania do interfejsu API wyszukiwania w Internecie Bing
  • Wyświetlanie wyników zapytania w kolejności uporządkowanej

Wymagania wstępne

Aby wykonać czynności opisane w samouczku, potrzebne są następujące elementy:

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Po utworzeniu subskrypcji platformy Azure w Azure Portal, aby uzyskać klucz i punkt końcowy. Po wdrożeniu kliknij pozycję Przejdź do zasobu.
  • Środowisko IDE programu Visual Studio.

Tworzenie nowego projektu aplikacji konsolowej

W programie Visual Studio utwórz projekt za pomocą kombinacji Ctrl+Shift+N.

W oknie dialogowym Nowy projekt kliknij pozycję Visual C# > Klasyczna aplikacja konsolowa systemu > Windows (.NET Framework).

Nadaj aplikacji nazwę MyConsoleSearchApp, a następnie kliknij przycisk OK.

Dodawanie pakietu NuGet JSON.net do projektu

JSON.net umożliwia pracę z odpowiedziami JSON zwracanymi przez interfejs API. Dodaj pakiet NuGet do projektu:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt i wybierz pozycję Zarządzaj pakietami NuGet....
  • Na karcie Przeglądaj wyszukaj ciąg Newtonsoft.Json. Wybierz najnowszą wersję, a następnie kliknij przycisk Zainstaluj.
  • Kliknij przycisk OK w oknie Przeglądanie zmian .
  • Zamknij kartę Programu Visual Studio zatytułowaną NuGet: MyConsoleSearchApp.

Dodawanie odwołania do pliku System.Web

Ten samouczek opiera się na System.Web zestawie. Dodaj odwołanie do tego zestawu do projektu:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję Odwołania i wybierz polecenie Dodaj odwołanie...
  • Wybierz pozycję Zestawy > Framework, a następnie przewiń w dół i zaznacz pozycję System.Web
  • Wybierz przycisk OK.

Dodawanie niektórych niezbędnych instrukcji using

Kod w tym samouczku wymaga trzech dodatkowych instrukcji using. Dodaj następujące instrukcje poniżej istniejących using instrukcji w górnej części pliku Program.cs:

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

Poproś użytkownika o zapytanie

W Eksplorator rozwiązań otwórz plik Program.cs. Zaktualizuj metodę 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();
}

Ta metoda:

  • Pyta użytkownika o zapytanie
  • Wywołania RunQueryAndDisplayResults(userQuery) w celu wykonania zapytania i wyświetlenia wyników
  • Czeka na dane wejściowe użytkownika, aby zapobiec natychmiastowemu zamknięciu okna konsoli.

Wyszukiwanie wyników zapytań przy użyciu interfejsu API wyszukiwania w Internecie Bing

Następnie dodaj metodę, która wysyła zapytanie do interfejsu API i wyświetla wyniki:

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

Ta metoda:

  • Tworzy element HttpClient do wykonywania zapytań względem interfejsu API wyszukiwania w Sieci Web
  • Ocp-Apim-Subscription-Key Ustawia nagłówek HTTP, którego usługa Bing używa do uwierzytelniania żądania
  • Wykonuje żądanie i używa JSON.net do deserializacji wyników
  • Wywołania DisplayAllRankedResults(responseObjects) w celu wyświetlenia wszystkich wyników w kolejności uporządkowanej

Pamiętaj, aby ustawić wartość Ocp-Apim-Subscription-Key klucza subskrypcji.

Wyświetlanie sklasyfikowanych wyników

Przed pokazaniem sposobu wyświetlania wyników w kolejności uporządkowanej zapoznaj się z przykładową odpowiedzią wyszukiwania w Internecie:

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

Obiekt rankingResponse JSON (dokumentacja) opisuje odpowiednią kolejność wyświetlania wyników wyszukiwania. Obejmuje ona co najmniej jedną z następujących grup z priorytetem:

  • pole: Wyniki wyszukiwania w celu uzyskania najbardziej widocznej metody (na przykład wyświetlanej powyżej linii głównej i paska bocznego).
  • mainline: wyniki wyszukiwania do wyświetlenia w wierszu głównym.
  • sidebar: wyniki wyszukiwania do wyświetlenia na pasku bocznym. Jeśli nie ma paska bocznego, wyświetl wyniki poniżej linii głównej.

Kod JSON odpowiedzi klasyfikacji może zawierać co najmniej jedną grupę.

W pliku Program.cs dodaj następującą metodę, aby wyświetlić wyniki w prawidłowo uporządkowanej kolejności:

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

Ta metoda:

  • Pętle na rankingResponse grupach, które zawiera odpowiedź
  • Wyświetla elementy w każdej grupie przez wywołanie DisplaySpecificResults(...)

W pliku Program.cs dodaj następujące dwie 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();
}

Te metody współpracują ze sobą w celu wyprowadzenia wyników wyszukiwania do konsoli.

Uruchamianie aplikacji

Uruchom aplikację. Dane wyjściowe powinny wyglądać mniej więcej tak:

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

...

Następne kroki

Dowiedz się więcej o używaniu klasyfikacji do wyświetlania wyników.