Выделение обращений в службе поиска Azure

Я новичок в службе поиска Azure и хотел использовать функцию выделения совпадений службы поиска Azure. Я использую пакет NuGet .NET SDK для поиска в лазурном режиме.
Я использовал объект SearchParameter, чтобы упомянуть поля выделения совпадений, а также теги Pre и Post, которые мне нужны.

searchParameters.HighlightFields = new[] { "Description"};
searchParameters.HighlightPreTag = "<b>";
searchParameters.HighlightPostTag = "</b>";
_searchIndexClient.Documents.Search(searchText, searchParameters);

Я ожидаю чего-то вроде этого:
SearchText: лучший
Результат (Описание): лучший продукт
Проблема в том, что я не вижу разницы в результате с / без с помощью выделения. (Поле описания доступно для поиска)
Я что-то упустил?


person Pratik Bhattacharya    schedule 09.04.2015    source источник
comment
Привет, Pratik, я из группы поиска Azure. Вы смотрели свойство Highlights объекта SearchResult? msdn.microsoft. ru / en-US / library / azure / `1.   -  person Bruce Johnston    schedule 09.04.2015
comment
Привет, Брюс, спасибо, что указал в этом направлении, это решило мою проблему. Однако я просто хочу спросить одну вещь: возможно ли получить весь текст определенного поля с тегами pre и post, а не получить текстовые фрагменты этого поля?   -  person Pratik Bhattacharya    schedule 10.04.2015
comment
Сегодня мы не поддерживаем это, но вы можете запросить это на нашем сайте User Voice: feedback.azure.com/forums/263029-azure-search Если вы также включите некоторые подробности о своем сценарии, это поможет нам расставить приоритеты. Спасибо!   -  person Bruce Johnston    schedule 13.04.2015


Ответы (2)


Результаты выделения попаданий отображаются через свойство Highlights класса SearchResultBase: ссылка

person Bruce Johnston    schedule 13.04.2015
comment
@ttugates Исправлено. Спасибо, что сообщили об этом! - person Bruce Johnston; 07.11.2019

Свойство Highlights содержит только часть полного значения поля. Если вы хотите показать полное значение поля, вам нужно объединить выделение в значение поля.

Вот фрагмент, который мне подходит:

public static string Highlight<T>(string fieldName, SearchResult<T> fromResult) where T : class
{
    var value = fromResult.Document.GetType().GetProperty(fieldName).GetValue(fromResult.Document, null) as string;

    if (fromResult.Highlights == null || !fromResult.Highlights.ContainsKey(fieldName))
    {
        return value);
    }

    var highlights = fromResult.Highlights[fieldName];

    var hits = highlights
        .Select(h => h.Replace("<b>", string.Empty).Replace("</b>", string.Empty))
        .ToList();

    for (int i = 0; i < highlights.Count; i++)
    {
        value = value.Replace(hits[i], highlights[i]);
    }

    return value;
}

Для ASP.Net MVC

public static MvcHtmlString Highlight<T>(this HtmlHelper htmlHelper, string fieldName, SearchResult<T> fromResult) where T : class
{
    var value = fromResult.Document.GetType().GetProperty(fieldName).GetValue(fromResult.Document, null) as string;

    if (fromResult.Highlights == null || !fromResult.Highlights.ContainsKey(fieldName))
    {
        return MvcHtmlString.Create(htmlHelper.Encode(value));
    }

    var highlights = fromResult.Highlights[fieldName];

    var hits = highlights
        .Select(h => h.Replace("<b>", string.Empty).Replace("</b>", string.Empty))
        .ToList();

    for (int i = 0; i < highlights.Count; i++)
    {
        value = value.Replace(hits[i], highlights[i]);
    }

    return MvcHtmlString.Create(htmlHelper.Encode(value).Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>"));
}

В представлении вы можете использовать это так:

@model SearchResult<MySearchDocument>
@Html.Highlight(nameof(MySearchDocument.Name), Model)
person Markus    schedule 13.07.2016