summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2025-03-03 23:01:24 +0600
committerunwox <me@unwox.com>2025-03-03 23:01:24 +0600
commit8eb33976570748b67c5e45846b21d063a3bfc355 (patch)
tree92db79d5d1341d98a9c0dc1335c708c4fab97963
parent12db769293ae0cf556e677c5ab8afedb98dc8f60 (diff)
improve synonyms
-rw-r--r--bin/serve.fnl41
-rw-r--r--lib/synonyms.fnl55
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}