跳至內容
Astera Technology

索引與查詢的拆字規則要一致

真正建立小型反向索引,再跑查詢拆字。

下載完整個案資料及參考答案 ↓

訂判斷及所需輸入

假設索引在非大寫英文或數字處拆開,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"}]}
下載可編輯 CSV ↓

跑所附比較

程序真正建字詞對文件集合並取交集;未提供完整代碼身分規則、詞幹引擎或供應商搜尋功能。

錯誤及所需輸出
路徑輸出 JSON
錯誤路徑{"queryTokens":["AB-12"],"matches":[]}
所需路徑{"queryTokens":["AB","12"],"matches":["D1"]}
下載可編輯 CSV ↓
完整本地 Node24.14.1 程序
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 用空格隔,也配同兩鍵;全標點查詢沒有鍵便停,避免空條件迴圈把全部文件當相符。

  1. 核索引怎樣拆
  2. 查詢沿同一規則
  3. 真正取字詞交集

拆後查詢空,不等於所有文件都相符。

可編輯邊界輸入及結果
條件輸入 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"}
下載可編輯 CSV ↓

原例更正後,為何配到 D1?

查看參考答案

D1 在同一拆法下有 AB、12;D2 欠12。整字 AB-12 從未是索引鍵。

相關資源