mirror of
https://github.com/zadam/trilium.git
synced 2025-12-13 02:44:24 +01:00
80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
"use strict";
|
|
|
|
import beccaService from "../../becca/becca_service.js";
|
|
import becca from "../../becca/becca.js";
|
|
|
|
class SearchResult {
|
|
notePathArray: string[];
|
|
score: number;
|
|
notePathTitle: string;
|
|
highlightedNotePathTitle?: string;
|
|
|
|
constructor(notePathArray: string[]) {
|
|
this.notePathArray = notePathArray;
|
|
this.notePathTitle = beccaService.getNoteTitleForPath(notePathArray);
|
|
this.score = 0;
|
|
}
|
|
|
|
get notePath() {
|
|
return this.notePathArray.join('/');
|
|
}
|
|
|
|
get noteId() {
|
|
return this.notePathArray[this.notePathArray.length - 1];
|
|
}
|
|
|
|
computeScore(fulltextQuery: string, tokens: string[]) {
|
|
this.score = 0;
|
|
|
|
const note = becca.notes[this.noteId];
|
|
const normalizedQuery = fulltextQuery.toLowerCase();
|
|
const normalizedTitle = note.title.toLowerCase();
|
|
|
|
// Note ID exact match, much higher score
|
|
if (note.noteId.toLowerCase() === fulltextQuery) {
|
|
this.score += 1000;
|
|
}
|
|
|
|
// Title matching scores, make sure to always win
|
|
if (normalizedTitle === normalizedQuery) {
|
|
this.score += 2000; // Increased from 1000 to ensure exact matches always win
|
|
}
|
|
else if (normalizedTitle.startsWith(normalizedQuery)) {
|
|
this.score += 500; // Increased to give more weight to prefix matches
|
|
}
|
|
else if (normalizedTitle.includes(` ${normalizedQuery} `) ||
|
|
normalizedTitle.startsWith(`${normalizedQuery} `) ||
|
|
normalizedTitle.endsWith(` ${normalizedQuery}`)) {
|
|
this.score += 300; // Increased to better distinguish word matches
|
|
}
|
|
|
|
// Add scores for partial matches with adjusted weights
|
|
this.addScoreForStrings(tokens, note.title, 2.0); // Increased to give more weight to title matches
|
|
this.addScoreForStrings(tokens, this.notePathTitle, 0.3); // Reduced to further de-emphasize path matches
|
|
|
|
if (note.isInHiddenSubtree()) {
|
|
this.score = this.score / 3; // Increased penalty for hidden notes
|
|
}
|
|
}
|
|
|
|
addScoreForStrings(tokens: string[], str: string, factor: number) {
|
|
const chunks = str.toLowerCase().split(" ");
|
|
|
|
let tokenScore = 0;
|
|
for (const chunk of chunks) {
|
|
for (const token of tokens) {
|
|
if (chunk === token) {
|
|
tokenScore += 4 * token.length * factor;
|
|
} else if (chunk.startsWith(token)) {
|
|
tokenScore += 2 * token.length * factor;
|
|
} else if (chunk.includes(token)) {
|
|
tokenScore += token.length * factor;
|
|
}
|
|
}
|
|
}
|
|
this.score += tokenScore;
|
|
}
|
|
}
|
|
|
|
export default SearchResult;
|