diff options
author | Lia Lenckowski <lialenck@protonmail.com> | 2023-08-17 12:17:50 +0200 |
---|---|---|
committer | Lia Lenckowski <lialenck@protonmail.com> | 2023-08-17 12:17:50 +0200 |
commit | d5ef112748f6b3c7999a6335da2026e4d60f3eb9 (patch) | |
tree | 824c0260f1d8a5a25d4ecaf144dd1cd056097f8e /frontend | |
parent | 6ba3442ac42da3a72c0781fe5263052ff7cec820 (diff) | |
download | fastbangs-d5ef112748f6b3c7999a6335da2026e4d60f3eb9.tar fastbangs-d5ef112748f6b3c7999a6335da2026e4d60f3eb9.tar.bz2 fastbangs-d5ef112748f6b3c7999a6335da2026e4d60f3eb9.tar.zst |
swap fuse for a faster fuzzy search backend
Diffstat (limited to 'frontend')
-rw-r--r-- | frontend/start.ts | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/frontend/start.ts b/frontend/start.ts index 71c1923..4b8019d 100644 --- a/frontend/start.ts +++ b/frontend/start.ts @@ -1,7 +1,7 @@ import { e } from "./helper.ts" import { bangs } from "./query.ts" import { status } from "./ui.ts" -import Fuse from "./fuse.js" +import fuzzysort from "./fuzzysort.js" export function section_info_start() { return e("section", { class: "info" }, @@ -59,39 +59,39 @@ export function section_engine_select() { ) } -// TODO fuse is a bit slow; this search function may hinder fast typing -interface FuseItem { bang: string, name: string, url: string } -let bangsSearch: Promise<{ search: (name: string) => { item: FuseItem }[] }> | undefined = undefined; +interface FuzzItem<E> { score: number, obj: E } +let bangsSearch: Promise<(query: string) => FuzzItem<{bang: string, name: string, url: string}>[]> + | undefined = undefined; function setSearchResults(ul: HTMLElement, input: HTMLInputElement, submit: () => void) { if (bangsSearch === undefined) { bangsSearch = bangs.then(bangs => { - const searchSpace = [] + const searchSpace: {bang: string, name: string, url: string}[] = [] for (const k in bangs) { searchSpace.push({ bang: k, - name: bangs[k]!.name, - url: bangs[k]!.url + name: bangs[k]!.name!, + url: bangs[k]!.url! }) } - return new Fuse(searchSpace, { + return q => fuzzysort.go(q, searchSpace, { + threshhold: -5000, + limit: 5, keys: ["bang", "name"], - minMatchCharLength: 3 }) }) } - bangsSearch.then(fuse => { + bangsSearch.then(fs => { ul.innerHTML = "" - const results = fuse.search(input.value).slice(0, 5) + const results = fs(input.value) if (results.length === 0) ul.style.display = "none" else { ul.style.display = "flex" for (const r of results) { - const it = r.item - + const it = r.obj const li = e("li", {}, e("p", { class: "name" }, it.name), e("p", { class: "bang" }, it.bang)) |