訂判斷及所需輸入
假設索引在非大寫英文或數字處拆開,AB-12 成 AB、12。查詢若保整個 AB-12,就找不到該索引鍵;更正沿同一拆法,只配 D1,不配 D2 的 AB-56。
| 情況 | 輸入 JSON |
|---|---|
| 原例測試 | {"query":"AB-12","documents":[{"id":"D1","text":"AB-12"},{"id":"D2","text":"AB-56"}]} |
跑所附比較
程序真正建字詞對文件集合並取交集;未提供完整代碼身分規則、詞幹引擎或供應商搜尋功能。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"queryTokens":["AB-12"],"matches":[]} |
| 所需路徑 | {"queryTokens":["AB","12"],"matches":["D1"]} |
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
const tokenize=s=>s.split(/[^A-Z0-9]+/).filter(Boolean),index=new Map();
for(const d of i.documents)for(const token of tokenize(d.text)){if(!index.has(token))index.set(token,new Set());index.get(token).add(d.id);}
const query=corrected?tokenize(i.query):[i.query];if(query.length===0)return {held:true,reason:'empty-analysis'};
return {queryTokens:query,matches:i.documents.filter(d=>query.every(t=>index.get(t)?.has(d.id))).map(d=>d.id)};
};
const cases=[{"input":{"query":"AB-12","documents":[{"id":"D1","text":"AB-12"},{"id":"D2","text":"AB-56"}]},"corrected":false,"expected":{"queryTokens":["AB-12"],"matches":[]}},{"input":{"query":"AB-12","documents":[{"id":"D1","text":"AB-12"},{"id":"D2","text":"AB-56"}]},"corrected":true,"expected":{"queryTokens":["AB","12"],"matches":["D1"]}},{"input":{"query":"AB 12","documents":[{"id":"D1","text":"AB-12"},{"id":"D2","text":"AB-56"}]},"corrected":true,"expected":{"queryTokens":["AB","12"],"matches":["D1"]}},{"input":{"query":"---","documents":[{"id":"D1","text":"AB-12"}]},"corrected":true,"expected":{"held":true,"reason":"empty-analysis"}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
按邊界依據作判斷
AB、12 用空格隔,也配同兩鍵;全標點查詢沒有鍵便停,避免空條件迴圈把全部文件當相符。
- 核索引怎樣拆
- 查詢沿同一規則
- 真正取字詞交集
拆後查詢空,不等於所有文件都相符。
| 條件 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 兩字詞改用空格隔 | {"query":"AB 12","documents":[{"id":"D1","text":"AB-12"},{"id":"D2","text":"AB-56"}]} | {"queryTokens":["AB","12"],"matches":["D1"]} |
| 拆後沒有查詢字詞 | {"query":"---","documents":[{"id":"D1","text":"AB-12"}]} | {"held":true,"reason":"empty-analysis"} |
原例更正後,為何配到 D1?
查看參考答案
D1 在同一拆法下有 AB、12;D2 欠12。整字 AB-12 從未是索引鍵。