mirror of
https://github.com/zadam/trilium.git
synced 2025-12-06 23:44:25 +01:00
fix(fts5): correctly allow for exact word searches with fts5
This commit is contained in:
parent
334c7dd27a
commit
15719a1ee9
@ -135,6 +135,8 @@ class NoteContentFulltextExp extends Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info(`[FTS5-CONTENT] Found ${ftsResults.length} notes matching content search`);
|
||||||
|
|
||||||
// If we need to search protected notes, use the separate method
|
// If we need to search protected notes, use the separate method
|
||||||
if (searchProtected) {
|
if (searchProtected) {
|
||||||
const protectedResults = ftsSearchService.searchProtectedNotesSync(
|
const protectedResults = ftsSearchService.searchProtectedNotesSync(
|
||||||
@ -155,11 +157,35 @@ class NoteContentFulltextExp extends Expression {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle special cases that FTS5 doesn't support well
|
// Handle special cases that FTS5 doesn't support well
|
||||||
if (this.operator === "%=" || this.flatText) {
|
if (this.operator === "%=") {
|
||||||
// Fall back to original implementation for regex and flat text searches
|
// Fall back to original implementation for regex searches
|
||||||
return this.executeWithFallback(inputNoteSet, resultNoteSet, searchContext);
|
return this.executeWithFallback(inputNoteSet, resultNoteSet, searchContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If flatText search is enabled, also search attributes using FTS5
|
||||||
|
if (this.flatText) {
|
||||||
|
try {
|
||||||
|
const attributeNoteIds = ftsSearchService.searchAttributesSync(
|
||||||
|
this.tokens,
|
||||||
|
this.operator,
|
||||||
|
noteIdSet.size > 0 ? noteIdSet : undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
log.info(`[FTS5-ATTRIBUTES] Found ${attributeNoteIds.size} notes matching attribute search`);
|
||||||
|
|
||||||
|
// Add notes with matching attributes
|
||||||
|
for (const noteId of attributeNoteIds) {
|
||||||
|
if (becca.notes[noteId]) {
|
||||||
|
resultNoteSet.add(becca.notes[noteId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
log.error(`FTS5 attribute search failed: ${error}`);
|
||||||
|
// Fall back to traditional search for attributes only
|
||||||
|
return this.executeWithFallback(inputNoteSet, resultNoteSet, searchContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return resultNoteSet;
|
return resultNoteSet;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Handle structured errors from FTS service
|
// Handle structured errors from FTS service
|
||||||
@ -246,8 +272,8 @@ class NoteContentFulltextExp extends Expression {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now, we'll use FTS5 for most text searches
|
// FTS5 now supports exact match (=) with post-filtering for word boundaries
|
||||||
// but keep the original implementation for complex cases
|
// The FTS search service will filter results to ensure exact word matches
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +378,27 @@ class NoteContentFulltextExp extends Expression {
|
|||||||
// e.g., "asd" should not match "asdfasdf"
|
// e.g., "asd" should not match "asdfasdf"
|
||||||
if (!phrase.includes(' ')) {
|
if (!phrase.includes(' ')) {
|
||||||
// Single word: use exact word matching to avoid substring matches
|
// Single word: use exact word matching to avoid substring matches
|
||||||
return this.exactWordMatch(phrase, normalizedContent);
|
if (this.exactWordMatch(phrase, normalizedContent)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For flatText, also check attribute names/values
|
||||||
|
// Attributes in flatText appear as "#name" or "#name=value" or "~name" or "~name=value"
|
||||||
|
if (checkFlatTextAttributes) {
|
||||||
|
// Check for attribute value: #something=phrase or ~something=phrase
|
||||||
|
if (normalizedContent.includes(`=${phrase}`)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Check for attribute name: #phrase or ~phrase (followed by space or =)
|
||||||
|
if (normalizedContent.includes(`#${phrase} `) ||
|
||||||
|
normalizedContent.includes(`#${phrase}=`) ||
|
||||||
|
normalizedContent.includes(`~${phrase} `) ||
|
||||||
|
normalizedContent.includes(`~${phrase}=`)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For multi-word phrases, check if the phrase appears as consecutive words
|
// For multi-word phrases, check if the phrase appears as consecutive words
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user