Highlighting Usageedit
Allows to highlight search results on one or more fields.
The implementation uses either the lucene highlighter
, fast-vector-highlighter
or postings-highlighter
.
See the Elasticsearch documentation on highlighting for more detail.
Fluent DSL Exampleedit
s => s .Query(q => q .Match(m => m .Field(f => f.Name.Suffix("standard")) .Query("Upton Sons Shield Rice Rowe Roberts") ) ) .Highlight(h => h .PreTags("<tag1>") .PostTags("</tag1>") .Fields( fs => fs .Field(p => p.Name.Suffix("standard")) .Type("plain") .ForceSource() .FragmentSize(150) .NumberOfFragments(3) .NoMatchSize(150), fs => fs .Field(p => p.LeadDeveloper.FirstName) .Type(HighlighterType.Fvh) .PreTags("<name>") .PostTags("</name>") .BoundaryMaxScan(50) .HighlightQuery(q => q .Match(m => m .Field(p => p.LeadDeveloper.FirstName) .Query("Kurt Edgardo Naomi Dariana Justice Felton") ) ), fs => fs .Field(p => p.State.Suffix("offsets")) .Type(HighlighterType.Postings) .PreTags("<state>") .PostTags("</state>") .HighlightQuery(q => q .Terms(t => t .Field(f => f.State.Suffix("offsets")) .Terms( StateOfBeing.Stable.ToString().ToLowerInvariant(), StateOfBeing.BellyUp.ToString().ToLowerInvariant() ) ) ) ) )
Object Initializer Syntax Exampleedit
new SearchRequest<Project> { Query = new MatchQuery { Query = "Upton Sons Shield Rice Rowe Roberts", Field = "name.standard" }, Highlight = new Highlight { PreTags = new[] { "<tag1>" }, PostTags = new[] { "</tag1>" }, Fields = new Dictionary<Field, IHighlightField> { { "name.standard", new HighlightField { Type = HighlighterType.Plain, ForceSource = true, FragmentSize = 150, NumberOfFragments = 3, NoMatchSize = 150 } }, { "leadDeveloper.firstName", new HighlightField { Type = "fvh", BoundaryMaxScan = 50, PreTags = new[] { "<name>"}, PostTags = new[] { "</name>"}, HighlightQuery = new MatchQuery { Field = "leadDeveloper.firstName", Query = "Kurt Edgardo Naomi Dariana Justice Felton" } } }, { "state.offsets", new HighlightField { Type = HighlighterType.Postings, PreTags = new[] { "<state>"}, PostTags = new[] { "</state>"}, HighlightQuery = new TermsQuery { Field = "state.offsets", Terms = new [] { "stable", "bellyup" } } } } } } }
Example json output.
{ "query": { "match": { "name.standard": { "query": "Upton Sons Shield Rice Rowe Roberts" } } }, "highlight": { "pre_tags": [ "<tag1>" ], "post_tags": [ "</tag1>" ], "fields": { "name.standard": { "type": "plain", "force_source": true, "fragment_size": 150, "number_of_fragments": 3, "no_match_size": 150 }, "leadDeveloper.firstName": { "type": "fvh", "boundary_max_scan": 50, "pre_tags": [ "<name>" ], "post_tags": [ "</name>" ], "highlight_query": { "match": { "leadDeveloper.firstName": { "query": "Kurt Edgardo Naomi Dariana Justice Felton" } } } }, "state.offsets": { "type": "postings", "pre_tags": [ "<state>" ], "post_tags": [ "</state>" ], "highlight_query": { "terms": { "state.offsets": [ "stable", "bellyup" ] } } } } } }
Handling Responsesedit
response.ShouldBeValid(); foreach (var highlightsInEachHit in response.Hits.Select(d=>d.Highlights)) { foreach (var highlightField in highlightsInEachHit) { if (highlightField.Key == "name.standard") { foreach (var highlight in highlightField.Value.Highlights) { highlight.Should().Contain("<tag1>"); highlight.Should().Contain("</tag1>"); } } else if (highlightField.Key == "leadDeveloper.firstName") { foreach (var highlight in highlightField.Value.Highlights) { highlight.Should().Contain("<name>"); highlight.Should().Contain("</name>"); } } else if (highlightField.Key == "state.offsets") { foreach (var highlight in highlightField.Value.Highlights) { highlight.Should().Contain("<state>"); highlight.Should().Contain("</state>"); } } else { Assert.True(false, $"highlights contains unexpected key {highlightField.Key}"); } } }