diff options
| author | unwox <me@unwox.com> | 2025-03-03 23:01:24 +0600 |
|---|---|---|
| committer | unwox <me@unwox.com> | 2025-03-03 23:01:24 +0600 |
| commit | 8eb33976570748b67c5e45846b21d063a3bfc355 (patch) | |
| tree | 92db79d5d1341d98a9c0dc1335c708c4fab97963 | |
| parent | 12db769293ae0cf556e677c5ab8afedb98dc8f60 (diff) | |
improve synonyms
| -rw-r--r-- | bin/serve.fnl | 41 | ||||
| -rw-r--r-- | lib/synonyms.fnl | 55 |
2 files changed, 62 insertions, 34 deletions
diff --git a/bin/serve.fnl b/bin/serve.fnl index 4f77416..18909a9 100644 --- a/bin/serve.fnl +++ b/bin/serve.fnl @@ -2,16 +2,17 @@ (tset package :path (.. package.path ";./vendor/lpeglj/?.lua")) -(local math (require :math)) +(local array (require :lib.array)) +(local cache (require :lib.cache)) (local fennel (require :vendor.fennel)) +(local fs (require :lib.fs)) (local html (require :vendor.html)) (local libhtml (require :lib.html)) -(local array (require :lib.array)) +(local math (require :math)) +(local spellfix (require :lib.spellfix)) (local str (require :lib.string)) +(local synonyms (require :lib.synonyms)) (local texts (require :texts)) -(local fs (require :lib.fs)) -(local spellfix (require :lib.spellfix)) -(local cache (require :lib.cache)) (local {: must} (require :lib.utils)) (when _G.unpack @@ -38,26 +39,6 @@ (local db (must (luna.db.open "file:var/db.sqlite?_journal=WAL&_sync=NORMAL&_txlock=immediate"))) -(local query-synonyms { - "шэн" "шен" - "шен" "шэн" - "дянь" "дань" - "дань" "дянь" - "чжень" "чжэнь" - "чжэнь" "чжень" - "хун" "цун" - "цун" "хун" - "доска" "чабань" - "лунцзин" "лун цзин" - "лун цзин" "лунцзин" - "билочунь" "би ло чунь" - "би ло чунь" "билочунь" - "чахай" "сливник" - "сливник" "чахай" - "чабань" "доска" - "термос" "бутылка" - "бутылка" "термос"}) - (fn sanitize-input [input] (if input (str.trim (input:gsub "[=()<>']" "") " ") @@ -249,15 +230,7 @@ (table.insert query-args tag))) (when (and query (< 0 (# query))) (table.insert where-conds "search.title MATCH ?") - (table.insert query-args - (array.join - (map (fn [_ q] - (local lower-q (must (luna.utf8.lower q))) - (if (. query-synonyms lower-q) - (.. "(" q "* OR " (. query-synonyms lower-q) "*)") - (.. q "*"))) - (str.split query " ")) - " AND "))) + (table.insert query-args (synonyms.replace query))) (when (not (str.empty? site)) (table.insert where-conds "products.site = ?") (table.insert query-args site)) diff --git a/lib/synonyms.fnl b/lib/synonyms.fnl new file mode 100644 index 0000000..d3f314f --- /dev/null +++ b/lib/synonyms.fnl @@ -0,0 +1,55 @@ +(import-macros {: map} :lib.macro) + +(local str (require :lib.string)) +(local array (require :lib.array)) +(local {: must} (require :lib.utils)) + +(local synonyms + [["шэн" "шен"] + ["билочунь" "би ло чунь"] + ["бутылка" "термос"] + ["доска" "чабань"] + ["даньцун" "дяньцун" "дянь цун" "дань цун"] + ["гуанбай" "гуан бай"] + ["буланшань" "булан шань"] + ["биндао" "бин дао"] + ["лунцзин" "лун цзин"] + ["термос" "бутылка"] + ["чахай" "сливник"] + ["те гуань инь" "те гуаньинь" "тегуань инь" "тегуаньинь"] + ["чжень" "чжэнь"] + ["точа" "то ча"] + ["гушу" "гу шу"]]) + +(fn find-synonyms [word] + (var input-word (must (luna.utf8.lower word))) + (var result nil) + (each [_ synonyms-line (ipairs synonyms) &until result] + (each [_ synonym-word (ipairs synonyms-line) &until result] + (when (= input-word synonym-word) + (set result synonyms-line)))) + (print result) + result) + +(fn replace [line] + (var results []) + (let [words (str.split line " ") + words-count (# words)] + (for [i 1 words-count] + (var word nil) + (for [j i words-count] + (set word + (if (not word) + (. words j) + (.. word " " (. words j)))) + (table.insert results word)))) + (var final-result line) + (each [_ result (ipairs results)] + (local synonyms (find-synonyms result)) + (when synonyms + (var query (.. (array.join synonyms " OR ") "*")) + (set final-result + (: final-result :gsub result (.. "(" query ")"))))) + final-result) + +{: replace} |
