Когнитивные сервисы Microsoft – API Bing

Привет. Продолжаем изучать когнитивные сервисы Microsoft. В этот раз разберёмся с возможностями работы с API Bing. Увидим возможности автозаполнения введённой фразы, а также научимся работать с поиском.

API автозаполнения Bing

Данное API позволяет по куску фразы предположить, что пользователь мог бы искать на самом деле. Делается это используя поисковую систему Bing, на основе популярности запросов, вводимых пользователем, а также информации о пользователе, который делает запрос, если эта информация была передана.

При добавлении самих ключей, мы получаем сами ключи, адрес конечной точки и ссылку на документацию для быстрого старта.

Для того, чтобы получить автозаполнение нашей фразы, нужно отправить GET запрос на указанный в конечной точке адрес, дополнив его необходимыми параметрами.

Необходимо ввести следующее:

В Headers добавить параметр "Ocp-Apim-Subscription-Key" добавив туда выданный ключ.

В GET параметрах заполнить "mkt" - текущий рынок. Я введу "ru-ru", а список доступных можно увидеть здесь: https://docs.microsoft.com/rest/api/cognitiveservices/bing-autosuggest-api-v7-reference#market-codes

И в "query" записать сам запрос для заполнения.

Также есть необязательные параметры для Headers, заполняя которые можно повысить качество заполнения:

  • "X-Search-Location" – локация клиента (того кому нужно автозаполнение)
  • "X-MSEdge-ClientID" – идентификатор клиента из предыдущего ответа для автозаполнения.
  • "X-MSEdge-ClientIP" – ip адрес клиента

Ответ приходит в виде Json строки. На основе получаемого Json можно создать классы, для удобной десериализации и работы с данными.

public class Autosuggest
{
    public string Type { get; set; }
    public Instrumentation Instrumentation { get; set; }
    public Querycontext QueryContext { get; set; }
    public Suggestiongroup[] SuggestionGroups { get; set; }
}

public class Instrumentation
{
    public string PingUrlBase { get; set; }
    public string PageLoadPingUrl { get; set; }
}

public class Querycontext
{
    public string OriginalQuery { get; set; }
}

public class Suggestiongroup
{
    public string Name { get; set; }
    public Searchsuggestion[] SearchSuggestions { get; set; }
}

public class Searchsuggestion
{
    public string Url { get; set; }
    public string UrlPingSuffix { get; set; }
    public string DisplayText { get; set; }
    public string Query { get; set; }
    public string SearchKind { get; set; }
}

Сам код программы для демонстрации будет следующий:

static string host = "https://api.cognitive.microsoft.com";
static string path = "/bing/v7.0/Suggestions";
static string market = "ru-ru";
static string key = "insert_key";

static async Task<Autosuggest> Autosuggest(string query)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);

    string uri = host + path + "?mkt=" + market + "&query=" + System.Net.WebUtility.UrlEncode(query);

    HttpResponseMessage response = await client.GetAsync(uri);
    string contentString = await response.Content.ReadAsStringAsync();

    return JsonConvert.DeserializeObject<Autosuggest>(contentString);
}

static void Main(string[] args)
{
    string query = String.Empty;
    Console.WriteLine("Введите начало запроса, 0 для выхода");
    while (query != "0")
    {
        query = Console.ReadLine();
        if (string.IsNullOrEmpty(query) || query == "0")
        {
            continue;
        }
        var autosuggest = Autosuggest(query);
        Console.WriteLine("---");
        foreach (var group in autosuggest.Result.SuggestionGroups)
        {
            foreach (var groupSearchSuggestion in group.SearchSuggestions)
            {
                Console.WriteLine(groupSearchSuggestion.Query);
            }
        }
        Console.WriteLine("---");
    }
}

Вот так это работает:

Из ограничений стоит обратить внимание, что не стоит слать больше одного запроса в секунду.

API-интерфейсы поиска Bing

С помощью API для поиска, мы можем искать различные сущности, такие как изображения, новости, видео. После добавления ключей можно обратить внимание, что на этот раз доступно множество конечных точек.

Рассмотрим работу на примере поиска изображений.

В GET запросе, как и в API для автозаполнения, необходимо добавить ключ в Headers в параметре "Ocp-Apim-Subscription-Key"

Строка поиска передаётся в параметре "q"

static string host = "https://api.cognitive.microsoft.com";
static string path = "/bing/v7.0/images/search";
static string key = "insert_key";

static async Task ImageSearch(string query)
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);

    string uri = host + path + "?&q=" + System.Net.WebUtility.UrlEncode(query);

    HttpResponseMessage response = await client.GetAsync(uri);
    string contentString = await response.Content.ReadAsStringAsync();

    return JsonConvert.DeserializeObject(contentString);
}

В ответе мы получаем Json вот такой структуры:

Можно увидеть, что передаётся вся необходимая информация об изображениях, можно увидеть размеры, название, страница расположения, адрес превьюшки, дата публикации и адрес для получения самого изображения.

Сделав из неё класс для более комфортной работы, получил следующее

public class ImageSearch
{
    public string _type { get; set; }
    public Instrumentation Instrumentation { get; set; }
    public string WebSearchUrl { get; set; }
    public string WebSearchUrlPingSuffix { get; set; }
    public int TotalEstimatedMatches { get; set; }
    public int NextOffset { get; set; }
    public Value[] Value { get; set; }
}

public class Instrumentation
{
    public string PingUrlBase { get; set; }
    public string PageLoadPingUrl { get; set; }
}

public class Value
{
    public string WebSearchUrl { get; set; }
    public string WebSearchUrlPingSuffix { get; set; }
    public string Name { get; set; }
    public string ThumbnailUrl { get; set; }
    public DateTime DatePublished { get; set; }
    public string ContentUrl { get; set; }
    public string ContentUrlPingSuffix { get; set; }
    public string HostPageUrl { get; set; }
    public string HostPageUrlPingSuffix { get; set; }
    public string ContentSize { get; set; }
    public string EncodingFormat { get; set; }
    public string HostPageDisplayUrl { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    public Thumbnail Thumbnail { get; set; }
    public string ImageInsightsToken { get; set; }
    public Insightsmetadata InsightsMetadata { get; set; }
    public string ImageId { get; set; }
    public string AccentColor { get; set; }
}

public class Thumbnail
{
    public int Width { get; set; }
    public int Height { get; set; }
}

public class Insightsmetadata
{
    public int PagesIncludingCount { get; set; }
    public int AvailableSizesCount { get; set; }
}

Изменю код из предыдущего примера и получу следующее:

string query = String.Empty;
Console.WriteLine("Введите изображение для поиска, 0 для выхода");
while (query != "0")
{
    query = Console.ReadLine();
    if (string.IsNullOrEmpty(query) || query == "0")
    {
        continue;
    }
    var result = ImageSearch(query).Result;
    Console.WriteLine("---");
    foreach (var imageInfo in result.Value)
    {
       Console.WriteLine($"Width: {imageInfo.Width}, Height: {imageInfo.Height}");
       Console.WriteLine(imageInfo.ContentUrl);
       Console.WriteLine("---");
    }

}

Понятно, что искать изображения в консольном приложении — это не самый удобный вариант, но, в данном случае я показываю удобство работы с API. А прикрутить это всё к web приложению или добавить в чат-бот не составляет никаких проблем.

Вот так будет выглядеть процесс поиска:

Работать с API поиска в Bing очень комфортно. Не хватает, пожалуй, готовой библиотеки в NuGet, чтобы совсем это всё автоматизировать. Но никто не мешает написать свою и залить в тот же NuGet. Это, кстати, неплохая идея для проекта выходного дня. Хочет кто-нибудь заняться?

API Bing для поиска сущностей

Отдельным пунктом, почему-то вынесено это API. Оно позволяет искать людей, места и вещи.

Но API-интерфейсы поиска Bing включают в себя и поиск сущностей. И работа с ними, в общем-то, не отличается от всего остального. Поэтому описывать работу с ними я не буду.

Среди замечательных API Bing еще остаётся "API-интерфейс Bing для распознавания речи ", но это я рассмотрю в следующей статье, чтобы не делать текущую очень длинной.

На этом всё.

Приятного программирования.

Добавить комментарий