diff --git a/src/search/search-engine.ts b/src/search/search-engine.ts index 8dea3dc..da0f9ea 100644 --- a/src/search/search-engine.ts +++ b/src/search/search-engine.ts @@ -481,6 +481,15 @@ export class SearchEngine { query ) + let bestMatch: SearchMatch | undefined + if ( + matches.length > 0 && + query.getBestStringForExcerpt() && + matches[0].match.toLowerCase() === query.getBestStringForExcerpt() + ) { + bestMatch = matches.shift() + } + const lowerCaseBasename = note.basename.toLowerCase() const titleMatchWord = foundWords.find(word => lowerCaseBasename.includes(word.toLowerCase()) @@ -514,6 +523,10 @@ export class SearchEngine { } } + if (bestMatch) { + matches.unshift(bestMatch) + } + logVerbose(`Matches for note "${note.path}"`, matches) const resultNote: ResultNote = { score: result.score, diff --git a/src/tools/text-processing.ts b/src/tools/text-processing.ts index 8d2fb3a..1d19751 100644 --- a/src/tools/text-processing.ts +++ b/src/tools/text-processing.ts @@ -95,11 +95,16 @@ export class TextProcessor { query && (query.query.text.length > 1 || query.getExactTerms().length > 0) ) { - const best = text.indexOf(query.getBestStringForExcerpt()) - if (best > -1 && matches.find(m => m.offset === best)) { + const bestMatchStr = query.getBestStringForExcerpt() + const best = text.toLowerCase().indexOf(bestMatchStr) + if (best > -1) { + // We found the full query. We make it the first result, and remove any other match that it contains. + matches = matches.filter( + m => m.offset < best || m.offset >= best + bestMatchStr.length + ) matches.unshift({ offset: best, - match: query.getBestStringForExcerpt(), + match: originalText.substring(best, best + bestMatchStr.length), }) } }