Last updated by maurice 3 years ago
Highlighting
When thesearch method returns a collection of domain object hits (which it does by default or when result: "every"@), you can provide a @Closure that is called for each search result hit.Before being called the Closure is cloned, so it is made thread-safe.
The Closure is called with the following parameters:
- @highlighter@ - An instance of CompassHighlighter for that hit
- @index@ - The search result index
- @sr@ - The search-result object that will be returned by the
searchmethod. Normally this is aMap@, so you can store your arbitrary highlight data there. When @result: "every"it is theListof domain objects
Examples
With a typicalsearch method invocation:// This closure does the per-hit highlighting // sr is the actual Map returned by search, so use that for storage def songHighlighter = { highlighter, index, sr -> // lazy-init the storage if (!sr.highlights) { sr.highlights = [] } // store highlighted song lyrics; "lyrics" is a // searchable-property of the Song domain class sr.highlights[index] = highlighter.fragment("lyrics") }// Do the search, passing he highlighter option def searchResult = Song.search("summer winds", withHighlighter: songHighlighter)assert searchResult.highlights assert searchResult.highlights.size() == searchResult.results.size() assert (searchResult.highlights[0].indexOf("<b>summer</b>") > -1 && searchResult.highlights[0].indexOf("<b>winds</b>") > -1)
// Here we define the highlight closure inline // sr is the collection of matching domain classes, // so we need to define the storage externally this time def highlights = [] def songs = Song.searchEvery("summer winds", withHighlighter: { highlighter, index, sr -> // store highlighted song lyrics; "lyrics" is a // searchable-property of the Song domain class highlights[index] = highlighter.fragment("lyrics") })assert highlights.size() == songs.size() assert (highlights[0].indexOf("<b>summer</b>") > -1 || searchResult.highlights[0].indexOf("<b>winds</b>") > -1)



