lib/search/word_search: move some score calculation to virtual column

This commit is contained in:
2025-05-16 21:01:49 +02:00
parent 45c4c5f09a
commit 84ae7eca9e
2 changed files with 30 additions and 70 deletions

View File

@@ -39,43 +39,10 @@ SearchMode _determineSearchMode(String word) {
fts_results AS (
SELECT
"${tableName}FTS"."entryId",
CASE
WHEN "${tableName}FTS"."reading" = ? THEN 150
ELSE 100
END
100
+ "${tableName}"."baseScore"
+ (("${tableName}FTS"."reading" = ?) * 50)
- (substr(COALESCE("${TanosJLPTTableNames.jlptTag}"."jlptLevel", 'N0'), 2) * -5)
+ CASE
WHEN "${tableName}"."news" = 1
OR "${tableName}"."ichi" = 1
OR "${tableName}"."spec" = 1
OR "${tableName}"."gai" = 1
THEN 50
ELSE 0
END
+ CASE
WHEN "${tableName}"."news" = 1 THEN 10
WHEN "${tableName}"."news" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."ichi" = 1 THEN 10
WHEN "${tableName}"."ichi" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."spec" = 1 THEN 10
WHEN "${tableName}"."spec" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."gai" = 1 THEN 10
WHEN "${tableName}"."gai" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."orderNum" = 1 THEN 20
ELSE 0
END
AS "score"
FROM "${tableName}FTS"
LEFT JOIN "${TanosJLPTTableNames.jlptTag}" USING ("entryId")
@@ -91,39 +58,8 @@ SearchMode _determineSearchMode(String word) {
SELECT
"entryId",
50
+ "${tableName}"."baseScore"
- (substr(COALESCE("${TanosJLPTTableNames.jlptTag}"."jlptLevel", 'N0'), 2) * -5)
+ CASE
WHEN "${tableName}"."news" = 1
OR "${tableName}"."ichi" = 1
OR "${tableName}"."spec" = 1
OR "${tableName}"."gai" = 1
THEN 50
ELSE 0
END
+ CASE
WHEN "${tableName}"."news" = 1 THEN 10
WHEN "${tableName}"."news" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."ichi" = 1 THEN 10
WHEN "${tableName}"."ichi" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."spec" = 1 THEN 10
WHEN "${tableName}"."spec" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "${tableName}"."gai" = 1 THEN 10
WHEN "${tableName}"."gai" = 2 THEN 5
ELSE 0
END
+ CASE
WHEN "orderNum" = 1 THEN 20
ELSE 0
END
AS "score"
FROM "${tableName}"
LEFT JOIN "${TanosJLPTTableNames.jlptTag}" USING ("entryId")

View File

@@ -47,12 +47,24 @@ CREATE TABLE "JMdict_KanjiElement" (
"spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2),
"gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2),
"nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48),
"baseScore" INTEGER NOT NULL AS (
(("news" IS 1 OR "ichi" IS 1 OR "spec" IS 1 OR "gai" IS 1) * 50)
+ (("news" IS 1) * 10)
+ (("news" IS 2) * 5)
+ (("ichi" IS 1) * 10)
+ (("ichi" IS 2) * 5)
+ (("spec" IS 1) * 10)
+ (("spec" IS 2) * 5)
+ (("gai" IS 1) * 10)
+ (("gai" IS 2) * 5)
+ (("orderNum" IS 1) * 20)
) STORED,
PRIMARY KEY ("entryId", "reading"),
UNIQUE("entryId", "orderNum")
) WITHOUT ROWID;
CREATE INDEX "JMdict_KanjiElement_byEntryId_byOrderNum" ON "JMdict_KanjiElement"("entryId", "orderNum");
CREATE INDEX "JMdict_KanjiElement_byReading" ON "JMdict_KanjiElement"("reading");
CREATE INDEX "JMdict_KanjiElement_byReading_byBaseScore" ON "JMdict_KanjiElement"("reading", "baseScore");
CREATE TABLE "JMdict_KanjiElementInfo" (
"entryId" INTEGER NOT NULL,
@@ -75,12 +87,24 @@ CREATE TABLE "JMdict_ReadingElement" (
"spec" INTEGER CHECK ("spec" BETWEEN 1 AND 2),
"gai" INTEGER CHECK ("gai" BETWEEN 1 AND 2),
"nf" INTEGER CHECK ("nf" BETWEEN 1 AND 48),
"baseScore" INTEGER NOT NULL AS (
(("news" IS 1 OR "ichi" IS 1 OR "spec" IS 1 OR "gai" IS 1) * 50)
+ (("news" IS 1) * 10)
+ (("news" IS 2) * 5)
+ (("ichi" IS 1) * 10)
+ (("ichi" IS 2) * 5)
+ (("spec" IS 1) * 10)
+ (("spec" IS 2) * 5)
+ (("gai" IS 1) * 10)
+ (("gai" IS 2) * 5)
+ (("orderNum" IS 1) * 20)
) STORED,
PRIMARY KEY ("entryId", "reading"),
UNIQUE("entryId", "orderNum")
) WITHOUT ROWID;
CREATE INDEX "JMdict_ReadingElement_byEntryId_byOrderNum" ON "JMdict_ReadingElement"("entryId", "orderNum");
CREATE INDEX "JMdict_ReadingElement_byReading" ON "JMdict_ReadingElement"("reading");
CREATE INDEX "JMdict_ReadingElement_byReading_byBaseScore" ON "JMdict_ReadingElement"("reading", "baseScore");
CREATE TABLE "JMdict_ReadingElementRestriction" (
"entryId" INTEGER NOT NULL,