




















@@ -1,27 +1,10 @@
11import { describe, expect, it } from "vitest";
22import { expandQueryForFts, extractKeywords } from "./query-expansion.js";
334-function countKeyword(keywords: readonly string[], keyword: string): number {
5-let count = 0;
6-for (const candidate of keywords) {
7-if (candidate === keyword) {
8-count++;
9-}
10-}
11-return count;
12-}
13-144describe("extractKeywords", () => {
155it("extracts keywords from English conversational query", () => {
166const keywords = extractKeywords("that thing we discussed about the API");
17-expect(keywords).toContain("discussed");
18-expect(keywords).toContain("api");
19-// Should not include stop words
20-expect(keywords).not.toContain("that");
21-expect(keywords).not.toContain("thing");
22-expect(keywords).not.toContain("we");
23-expect(keywords).not.toContain("about");
24-expect(keywords).not.toContain("the");
7+expect(keywords).toStrictEqual(["discussed", "api"]);
258});
2692710it("extracts keywords from Chinese conversational query", () => {
@@ -43,25 +26,17 @@ describe("extractKeywords", () => {
43264427it("returns specific technical terms", () => {
4528const keywords = extractKeywords("what was the solution for the CFR bug");
46-expect(keywords).toContain("solution");
47-expect(keywords).toContain("cfr");
48-expect(keywords).toContain("bug");
29+expect(keywords).toStrictEqual(["solution", "cfr", "bug"]);
4930});
50315132it("extracts keywords from Korean conversational query", () => {
5233const keywords = extractKeywords("어제 논의한 배포 전략");
53-expect(keywords).toContain("논의한");
54-expect(keywords).toContain("배포");
55-expect(keywords).toContain("전략");
56-// Should not include stop words
57-expect(keywords).not.toContain("어제");
34+expect(keywords).toStrictEqual(["논의한", "배포", "전략"]);
5835});
59366037it("strips Korean particles to extract stems", () => {
6138const keywords = extractKeywords("서버에서 발생한 에러를 확인");
62-expect(keywords).toContain("서버");
63-expect(keywords).toContain("에러");
64-expect(keywords).toContain("확인");
39+expect(keywords).toStrictEqual(["서버에서", "서버", "발생한", "에러를", "에러", "확인"]);
6540});
66416742it("filters Korean stop words including inflected forms", () => {
@@ -88,14 +63,12 @@ describe("extractKeywords", () => {
88638964it("strips longest Korean trailing particles first", () => {
9065const keywords = extractKeywords("기능으로 설명");
91-expect(keywords).toContain("기능");
92-expect(keywords).not.toContain("기능으");
66+expect(keywords).toStrictEqual(["기능으로", "기능", "설명"]);
9367});
94689569it("keeps stripped ASCII stems for mixed Korean tokens", () => {
9670const keywords = extractKeywords("API를 배포했다");
97-expect(keywords).toContain("api");
98-expect(keywords).toContain("배포했다");
71+expect(keywords).toStrictEqual(["api를", "api", "배포했다"]);
9972});
1007310174it("handles mixed Korean and English query", () => {
@@ -129,18 +102,12 @@ describe("extractKeywords", () => {
129102130103it("extracts keywords from Spanish conversational query", () => {
131104const keywords = extractKeywords("ayer hablamos sobre la estrategia de despliegue");
132-expect(keywords).toContain("estrategia");
133-expect(keywords).toContain("despliegue");
134-expect(keywords).not.toContain("ayer");
135-expect(keywords).not.toContain("sobre");
105+expect(keywords).toStrictEqual(["hablamos", "estrategia", "despliegue"]);
136106});
137107138108it("extracts keywords from Portuguese conversational query", () => {
139109const keywords = extractKeywords("ontem falamos sobre a estratégia de implantação");
140-expect(keywords).toContain("estratégia");
141-expect(keywords).toContain("implantação");
142-expect(keywords).not.toContain("ontem");
143-expect(keywords).not.toContain("sobre");
110+expect(keywords).toStrictEqual(["falamos", "estratégia", "implantação"]);
144111});
145112146113it("filters Spanish and Portuguese question stop words", () => {
@@ -155,10 +122,7 @@ describe("extractKeywords", () => {
155122156123it("extracts keywords from Arabic conversational query", () => {
157124const keywords = extractKeywords("بالأمس ناقشنا استراتيجية النشر");
158-expect(keywords).toContain("ناقشنا");
159-expect(keywords).toContain("استراتيجية");
160-expect(keywords).toContain("النشر");
161-expect(keywords).not.toContain("بالأمس");
125+expect(keywords).toStrictEqual(["ناقشنا", "استراتيجية", "النشر"]);
162126});
163127164128it("filters Arabic question stop words", () => {
@@ -176,12 +140,12 @@ describe("extractKeywords", () => {
176140177141it("handles query with only stop words", () => {
178142const keywords = extractKeywords("the a an is are");
179-expect(keywords.length).toBe(0);
143+expect(keywords).toStrictEqual([]);
180144});
181145182146it("removes duplicate keywords", () => {
183147const keywords = extractKeywords("test test testing");
184-expect(countKeyword(keywords, "test")).toBe(1);
148+expect(keywords).toStrictEqual(["test", "testing"]);
185149});
186150187151describe("with trigram tokenizer", () => {
@@ -233,21 +197,28 @@ describe("extractKeywords", () => {
233197describe("expandQueryForFts", () => {
234198it("returns original query and extracted keywords", () => {
235199const result = expandQueryForFts("that API we discussed");
236-expect(result.original).toBe("that API we discussed");
237-expect(result.keywords).toContain("api");
238-expect(result.keywords).toContain("discussed");
200+expect(result).toStrictEqual({
201+original: "that API we discussed",
202+keywords: ["api", "discussed"],
203+expanded: "that API we discussed OR api OR discussed",
204+});
239205});
240206241207it("builds expanded OR query for FTS", () => {
242208const result = expandQueryForFts("the solution for bugs");
243-expect(result.expanded).toContain("OR");
244-expect(result.expanded).toContain("solution");
245-expect(result.expanded).toContain("bugs");
209+expect(result).toStrictEqual({
210+original: "the solution for bugs",
211+keywords: ["solution", "bugs"],
212+expanded: "the solution for bugs OR solution OR bugs",
213+});
246214});
247215248216it("returns original query when no keywords extracted", () => {
249217const result = expandQueryForFts("the");
250-expect(result.keywords.length).toBe(0);
251-expect(result.expanded).toBe("the");
218+expect(result).toStrictEqual({
219+original: "the",
220+keywords: [],
221+expanded: "the",
222+});
252223});
253224});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。