I am new to Azure Search Service, and I wanted to use the hit highlighting feature of Azure Search Service. I am using the .NET SDK NuGet package for azure search.
I used SearchParameter object to mention the hit highlight fields and also the Pre and Post Tag that I require.
searchParameters.HighlightFields = new[] { "Description"};
searchParameters.HighlightPreTag = "<b>";
searchParameters.HighlightPostTag = "</b>";
_searchIndexClient.Documents.Search(searchText, searchParameters);
I am expecting something like this:
SearchText: best
Result (Description) : The best product
The issue is that I do not see any difference in the result with/without using hit highlight. (Description Field is searchable)
Am I missing something?
Hit highlighting results are exposed via the Highlights
property of the SearchResultBase
class:
https://msdn.microsoft.com/en-us/library/azure/dn972982.aspx#P:Microsoft.Azure.Search.Models.SearchResultBase`1.Highlights
The Highlights property contains just a part of the full field value. If you want to show the full field value, you have to merge the highlights into your field value.
Here a snippet that works for me:
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;
}
For 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("<b>", "<b>").Replace("</b>", "</b>"));
}
In the View you can use it like this:
@model SearchResult<MySearchDocument>
@Html.Highlight(nameof(MySearchDocument.Name), Model)