diff --git a/src/search/search-engine.ts b/src/search/search-engine.ts index 266c4a4..778f32e 100644 --- a/src/search/search-engine.ts +++ b/src/search/search-engine.ts @@ -112,13 +112,14 @@ export class SearchEngine { */ public async search( query: Query, - options = { fuzzy: 0.1 } + options = { fuzzy: 0.1, prefix: false } ): Promise { if (!query.segmentsToStr()) return [] let results = this.minisearch.search(query.segmentsToStr(), { - prefix: false, - // fuzzy: term => (term.length > 4 ? 0.2 : false), + prefix: term => { + return options.prefix || term.length > 4 + }, fuzzy: options.fuzzy, combineWith: 'AND', boost: { @@ -207,7 +208,9 @@ export class SearchEngine { // Get the raw results let results = await this.search(query) if (results.length == 0) { - results = await this.search(query, { fuzzy: 0.2 }) + if (settings.retryWhenZeroResult) { + results = await this.search(query, { fuzzy: 0.2, prefix: true }) + } } if (!results.length) return [] diff --git a/src/settings.ts b/src/settings.ts index d3985c8..57c55cc 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -26,8 +26,6 @@ export interface OmnisearchSettings extends WeightingSettings { PDFIndexing: boolean /** Max number of spawned processes for background tasks, such as extracting text from PDFs */ backgroundProcesses: number - /** Write cache files on disk (unrelated to PDFs) */ - // persistCache: boolean /** Display Omnisearch popup notices over Obsidian */ showIndexingNotices: boolean /** Activate the small 🔍 button on Obsidian's ribbon */ @@ -46,6 +44,8 @@ export interface OmnisearchSettings extends WeightingSettings { CtrlNP: boolean /** Key for the welcome message when Obsidian is updated. A message is only shown once. */ welcomeMessage: string + /** If a query returns 0 result, try again with more relax conditions */ + retryWhenZeroResult: boolean } /** @@ -71,7 +71,7 @@ export class SettingsTab extends PluginSettingTab { containerEl.empty() // Settings main title - containerEl.createEl('h2', { text: 'Omnisearch settings' }) + containerEl.createEl('h2', { text: 'Omnisearch' }) // Sponsor link - Thank you! const divSponsor = containerEl.createDiv() @@ -101,7 +101,8 @@ export class SettingsTab extends PluginSettingTab { const diacriticsDesc = new DocumentFragment() diacriticsDesc.createSpan({}, span => { span.innerHTML = `Normalize diacritics in search terms. Words like "brûlée" or "žluťoučký" will be indexed as "brulee" and "zlutoucky".
- Needs a restart to fully take effect.` + You probably shouldn't disable this. Needs a restart to fully take effect. + ` }) new Setting(containerEl) .setName('Ignore diacritics') @@ -117,7 +118,7 @@ export class SettingsTab extends PluginSettingTab { const indexedFileTypesDesc = new DocumentFragment() indexedFileTypesDesc.createSpan({}, span => { span.innerHTML = `In addition to standard md files, Omnisearch can also index other plain text files.
- Add extensions separated by a space. Example: txt org.
+ Add extensions separated by a space, without the dot. Example: "txt org".
Needs a restart to fully take effect.` }) new Setting(containerEl) @@ -133,43 +134,18 @@ export class SettingsTab extends PluginSettingTab { }) }) - // // Background processes - // new Setting(containerEl) - // .setName( - // `Background processes (default: ${DEFAULT_SETTINGS.backgroundProcesses})` - // ) - // .setDesc('The maximum number of processes for background work, like PDF indexing. This value should not be higher than your number of CPU cores.') - // .addSlider(cb => { - // cb.setLimits(1, 16, 1) - // .setValue(settings.backgroundProcesses) - // .setDynamicTooltip() - // .onChange(v => { - // settings.backgroundProcesses = v - // saveSettings(this.plugin) - // }) - // }) - - // // Store index - // const serializedIndexDesc = new DocumentFragment() - // serializedIndexDesc.createSpan({}, span => { - // span.innerHTML = `This will speedup startup times after the initial indexing. Do not activate it unless indexing is too slow on your device: - // - // Needs a restart to fully take effect. - // ` - // }) - // new Setting(containerEl) - // .setName('Persist cache on disk') - // .setDesc(serializedIndexDesc) - // .addToggle(toggle => - // toggle.setValue(settings.persistCache).onChange(async v => { - // settings.persistCache = v - // await saveSettings(this.plugin) - // }) - // ) + // Ignore diacritics + new Setting(containerEl) + .setName('Retry queries that return zero result') + .setDesc( + `When a query returns zero result, Omnisearch will try again (but harder). Enabling this may incur some freezes.` + ) + .addToggle(toggle => + toggle.setValue(settings.retryWhenZeroResult).onChange(async v => { + settings.retryWhenZeroResult = v + await saveSettings(this.plugin) + }) + ) // PDF Indexing const indexPDFsDesc = new DocumentFragment() @@ -201,9 +177,7 @@ export class SettingsTab extends PluginSettingTab { // Show Ribbon Icon new Setting(containerEl) .setName('Show ribbon button') - .setDesc( - 'Add a button on the sidebar to open the Vault search modal.' - ) + .setDesc('Add a button on the sidebar to open the Vault search modal.') .addToggle(toggle => toggle.setValue(settings.ribbonIcon).onChange(async v => { settings.ribbonIcon = v @@ -231,9 +205,7 @@ export class SettingsTab extends PluginSettingTab { // Show context excerpt new Setting(containerEl) .setName('Show previous query results') - .setDesc( - 'Re-executes the previous query when opening Omnisearch' - ) + .setDesc('Re-executes the previous query when opening Omnisearch') .addToggle(toggle => toggle.setValue(settings.showPreviousQueryResults).onChange(async v => { settings.showPreviousQueryResults = v @@ -311,27 +283,29 @@ export class SettingsTab extends PluginSettingTab { new Setting(containerEl).setName('Shortcuts').setHeading() - new Setting(containerEl) - .setName( - 'Use [Ctrl/Cmd]+j/k to navigate up/down in the results, if Vim mode is enabled' - ) - .addToggle(toggle => - toggle.setValue(settings.CtrlJK).onChange(async v => { - settings.CtrlJK = v - await saveSettings(this.plugin) - }) - ) + const ctrljk = new DocumentFragment() + ctrljk.createSpan({}, span => { + span.innerHTML = + 'Use [Ctrl/Cmd]+j/k to navigate up/down in the results, if Vim mode is enabled' + }) + new Setting(containerEl).setName(ctrljk).addToggle(toggle => + toggle.setValue(settings.CtrlJK).onChange(async v => { + settings.CtrlJK = v + await saveSettings(this.plugin) + }) + ) - new Setting(containerEl) - .setName( - 'Use [Ctrl/Cmd]+n/p to navigate up/down in the results, if Vim mode is enabled' - ) - .addToggle(toggle => - toggle.setValue(settings.CtrlNP).onChange(async v => { - settings.CtrlNP = v - await saveSettings(this.plugin) - }) - ) + const ctrlnp = new DocumentFragment() + ctrlnp.createSpan({}, span => { + span.innerHTML = + 'Use [Ctrl/Cmd]+j/k to navigate up/down in the results, if Vim mode is enabled' + }) + new Setting(containerEl).setName(ctrlnp).addToggle(toggle => + toggle.setValue(settings.CtrlNP).onChange(async v => { + settings.CtrlNP = v + await saveSettings(this.plugin) + }) + ) // #endregion Shortcuts } @@ -368,14 +342,15 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = { showExcerpt: true, showCreateButton: false, showPreviousQueryResults: true, + retryWhenZeroResult: false, weightBasename: 2, weightH1: 1.5, weightH2: 1.3, weightH3: 1.1, - CtrlJK: false, - CtrlNP: false, + CtrlJK: true, + CtrlNP: true, // persistCache: false,