Retry setting + tweaked prefix toggle

This commit is contained in:
Simon Cambier
2022-10-28 19:12:54 +02:00
parent 6b97af639e
commit 6fb5edfacd
2 changed files with 52 additions and 74 deletions

View File

@@ -112,13 +112,14 @@ export class SearchEngine {
*/ */
public async search( public async search(
query: Query, query: Query,
options = { fuzzy: 0.1 } options = { fuzzy: 0.1, prefix: false }
): Promise<SearchResult[]> { ): Promise<SearchResult[]> {
if (!query.segmentsToStr()) return [] if (!query.segmentsToStr()) return []
let results = this.minisearch.search(query.segmentsToStr(), { let results = this.minisearch.search(query.segmentsToStr(), {
prefix: false, prefix: term => {
// fuzzy: term => (term.length > 4 ? 0.2 : false), return options.prefix || term.length > 4
},
fuzzy: options.fuzzy, fuzzy: options.fuzzy,
combineWith: 'AND', combineWith: 'AND',
boost: { boost: {
@@ -207,7 +208,9 @@ export class SearchEngine {
// Get the raw results // Get the raw results
let results = await this.search(query) let results = await this.search(query)
if (results.length == 0) { 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 [] if (!results.length) return []

View File

@@ -26,8 +26,6 @@ export interface OmnisearchSettings extends WeightingSettings {
PDFIndexing: boolean PDFIndexing: boolean
/** Max number of spawned processes for background tasks, such as extracting text from PDFs */ /** Max number of spawned processes for background tasks, such as extracting text from PDFs */
backgroundProcesses: number backgroundProcesses: number
/** Write cache files on disk (unrelated to PDFs) */
// persistCache: boolean
/** Display Omnisearch popup notices over Obsidian */ /** Display Omnisearch popup notices over Obsidian */
showIndexingNotices: boolean showIndexingNotices: boolean
/** Activate the small 🔍 button on Obsidian's ribbon */ /** Activate the small 🔍 button on Obsidian's ribbon */
@@ -46,6 +44,8 @@ export interface OmnisearchSettings extends WeightingSettings {
CtrlNP: boolean CtrlNP: boolean
/** Key for the welcome message when Obsidian is updated. A message is only shown once. */ /** Key for the welcome message when Obsidian is updated. A message is only shown once. */
welcomeMessage: string 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() containerEl.empty()
// Settings main title // Settings main title
containerEl.createEl('h2', { text: 'Omnisearch settings' }) containerEl.createEl('h2', { text: 'Omnisearch' })
// Sponsor link - Thank you! // Sponsor link - Thank you!
const divSponsor = containerEl.createDiv() const divSponsor = containerEl.createDiv()
@@ -101,7 +101,8 @@ export class SettingsTab extends PluginSettingTab {
const diacriticsDesc = new DocumentFragment() const diacriticsDesc = new DocumentFragment()
diacriticsDesc.createSpan({}, span => { 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".<br/> span.innerHTML = `Normalize diacritics in search terms. Words like "brûlée" or "žluťoučký" will be indexed as "brulee" and "zlutoucky".<br/>
<strong style="color: var(--text-accent)">Needs a restart to fully take effect.</strong>` <strong style="color: var(--text-accent)">You probably shouldn't disable this. Needs a restart to fully take effect.</strong>
`
}) })
new Setting(containerEl) new Setting(containerEl)
.setName('Ignore diacritics') .setName('Ignore diacritics')
@@ -117,7 +118,7 @@ export class SettingsTab extends PluginSettingTab {
const indexedFileTypesDesc = new DocumentFragment() const indexedFileTypesDesc = new DocumentFragment()
indexedFileTypesDesc.createSpan({}, span => { indexedFileTypesDesc.createSpan({}, span => {
span.innerHTML = `In addition to standard <code>md</code> files, Omnisearch can also index other plain text files.<br/> span.innerHTML = `In addition to standard <code>md</code> files, Omnisearch can also index other plain text files.<br/>
Add extensions separated by a space. Example: <code>txt org</code>.<br /> Add extensions separated by a space, without the dot. Example: "<code>txt org</code>".<br />
<strong style="color: var(--text-accent)">Needs a restart to fully take effect.</strong>` <strong style="color: var(--text-accent)">Needs a restart to fully take effect.</strong>`
}) })
new Setting(containerEl) new Setting(containerEl)
@@ -133,43 +134,18 @@ export class SettingsTab extends PluginSettingTab {
}) })
}) })
// // Background processes // Ignore diacritics
// new Setting(containerEl) new Setting(containerEl)
// .setName( .setName('Retry queries that return zero result')
// `Background processes (default: ${DEFAULT_SETTINGS.backgroundProcesses})` .setDesc(
// ) `When a query returns zero result, Omnisearch will try again (but harder). Enabling this may incur some freezes.`
// .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 => { .addToggle(toggle =>
// cb.setLimits(1, 16, 1) toggle.setValue(settings.retryWhenZeroResult).onChange(async v => {
// .setValue(settings.backgroundProcesses) settings.retryWhenZeroResult = v
// .setDynamicTooltip() await saveSettings(this.plugin)
// .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:
// <ul>
// <li>PDF indexing is not affected by this setting</li>
// <li>⚠️ The index can become corrupted - if you notice any issue, disable and re-enable this option to clear the cache.</li>
// <li>⚠️ Cache files in <code>.obsidian/plugins/omnisearch/*.data</code> must not be synchronized between your devices.</li>
// </ul>
// <strong style="color: var(--text-accent)">Needs a restart to fully take effect.</strong>
// `
// })
// 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)
// })
// )
// PDF Indexing // PDF Indexing
const indexPDFsDesc = new DocumentFragment() const indexPDFsDesc = new DocumentFragment()
@@ -201,9 +177,7 @@ export class SettingsTab extends PluginSettingTab {
// Show Ribbon Icon // Show Ribbon Icon
new Setting(containerEl) new Setting(containerEl)
.setName('Show ribbon button') .setName('Show ribbon button')
.setDesc( .setDesc('Add a button on the sidebar to open the Vault search modal.')
'Add a button on the sidebar to open the Vault search modal.'
)
.addToggle(toggle => .addToggle(toggle =>
toggle.setValue(settings.ribbonIcon).onChange(async v => { toggle.setValue(settings.ribbonIcon).onChange(async v => {
settings.ribbonIcon = v settings.ribbonIcon = v
@@ -231,9 +205,7 @@ export class SettingsTab extends PluginSettingTab {
// Show context excerpt // Show context excerpt
new Setting(containerEl) new Setting(containerEl)
.setName('Show previous query results') .setName('Show previous query results')
.setDesc( .setDesc('Re-executes the previous query when opening Omnisearch')
'Re-executes the previous query when opening Omnisearch'
)
.addToggle(toggle => .addToggle(toggle =>
toggle.setValue(settings.showPreviousQueryResults).onChange(async v => { toggle.setValue(settings.showPreviousQueryResults).onChange(async v => {
settings.showPreviousQueryResults = v settings.showPreviousQueryResults = v
@@ -311,27 +283,29 @@ export class SettingsTab extends PluginSettingTab {
new Setting(containerEl).setName('Shortcuts').setHeading() new Setting(containerEl).setName('Shortcuts').setHeading()
new Setting(containerEl) const ctrljk = new DocumentFragment()
.setName( ctrljk.createSpan({}, span => {
'Use [Ctrl/Cmd]+j/k to navigate up/down in the results, if Vim mode is enabled' span.innerHTML =
) 'Use <code>[Ctrl/Cmd]+j/k</code> to navigate up/down in the results, if Vim mode is enabled'
.addToggle(toggle => })
toggle.setValue(settings.CtrlJK).onChange(async v => { new Setting(containerEl).setName(ctrljk).addToggle(toggle =>
settings.CtrlJK = v toggle.setValue(settings.CtrlJK).onChange(async v => {
await saveSettings(this.plugin) settings.CtrlJK = v
}) await saveSettings(this.plugin)
) })
)
new Setting(containerEl) const ctrlnp = new DocumentFragment()
.setName( ctrlnp.createSpan({}, span => {
'Use [Ctrl/Cmd]+n/p to navigate up/down in the results, if Vim mode is enabled' span.innerHTML =
) 'Use <code>[Ctrl/Cmd]+j/k</code> to navigate up/down in the results, if Vim mode is enabled'
.addToggle(toggle => })
toggle.setValue(settings.CtrlNP).onChange(async v => { new Setting(containerEl).setName(ctrlnp).addToggle(toggle =>
settings.CtrlNP = v toggle.setValue(settings.CtrlNP).onChange(async v => {
await saveSettings(this.plugin) settings.CtrlNP = v
}) await saveSettings(this.plugin)
) })
)
// #endregion Shortcuts // #endregion Shortcuts
} }
@@ -368,14 +342,15 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = {
showExcerpt: true, showExcerpt: true,
showCreateButton: false, showCreateButton: false,
showPreviousQueryResults: true, showPreviousQueryResults: true,
retryWhenZeroResult: false,
weightBasename: 2, weightBasename: 2,
weightH1: 1.5, weightH1: 1.5,
weightH2: 1.3, weightH2: 1.3,
weightH3: 1.1, weightH3: 1.1,
CtrlJK: false, CtrlJK: true,
CtrlNP: false, CtrlNP: true,
// persistCache: false, // persistCache: false,