本主題提供驗證和疑難解答 IWordBreaker 和 IStemmer 實作的最佳做法和建議。
本主題的組織方式如下:
最佳做法
- 請確定語言資源的線程模型在登錄中設定為 「both」。。
- 可能的話,請將語言數據放在 DLL 中的資源中,而不是放在個別的檔案中。 這可讓 DLL 更容易安裝和更安全。 此外,將語言數據放在資源中,將會導致該語言資源元件的效能提升。
- 將語言資源元件所使用的系統資源降到最低。 例如,如果語言資源物件的每個實例都需要語彙的唯讀存取權,請考慮在所有實例之間共用語彙。
- 請考慮使用中性的斷詞工具來處理不屬於您語言或地區設定的文字,以便實施斷詞功能。 這有助於確保在所有語言中一致地處理文字。
- 檢查所有傳回碼,並從 IStemmer::GenerateWordForms 和 IWordBreaker::BreakText等函式傳回它們。 如果索引編製失敗,務必要傳遞錯誤訊息,讓使用者了解哪些檔案已被索引。
測試詞幹分析器的一致性
建議您在下列情況下監視 IStemmer 實作的效能,以取得一致性:
- 字幹分析器在多次呼叫 IStemmer::Init時表現一致。 字幹分析器會使用與先前初始化中相同的參數重新初始化,而不會釋放參數。
- 假設相同的測試主體和相同查詢的重複,IStemmer::GenerateWordForms 會產生相同的輸出,並使用相同的呼叫 IWordFormSink 物件的方法。
測試詞幹分析器中的無效輸入
建議您監視 IStemmer 方法如何處理與無效參數相關的所有錯誤。 此外,我們建議您確保字幹分析器方法不會引發未處理的例外狀況。 字幹分析器應該處理下列錯誤:
- 呼叫 IStemmer::Init,並將 pfLicense 設為 NULL。 Init 失敗,而且不會產生存取違規。
- 呼叫 IStemmer::GetLicenseToUse,並將 ppwcsLicense 參數設定為 NULL。 IStemmer::GetLicenseToUse 不會產生存取違規。
- 呼叫 IStemmer::GenerateWordForms,並將 pwcInBuf 參數設定為 NULL。 IStemmer::GenerateWordForms 失敗(傳回E_FAIL),而且不會產生存取違規。
- 呼叫 IStemmer::GenerateWordForms,cwc 參數等於 0。 IStemmer::GenerateWordForms 成功傳回 (傳回S_OK),而且不會產生存取違規。
- 呼叫 IStemmer::GenerateWordForms,並將 pwcInBuf 參數設定為 NULL,而 cwc 參數等於 0。 IStemmer::GenerateWordForms 失敗(傳回E_FAIL),而且不會產生存取違規。
測試斷詞工具的一致性
我們建議您確定 IWordBreaker 實作會在下列情況下一致地執行:
- 斷詞工具會在其 IWordBreaker::Init 方法的多個呼叫之間一致地執行。 斷詞工具會使用與先前初始化中相同的參數重新初始化,而不會釋放參數。
- 假設相同的測試主體和相同查詢的重複,IWordBreaker::BreakText 方法會產生相同的輸出,並使用相同的呼叫 IWordSink 和 IPhraseSink 物件的方法。
測試詞彙切分器中的無效輸入
我們建議您確定 IWordBreaker 方法會處理與無效參數相關的所有錯誤。 此外,我們建議您確保斷詞方法不會引發未處理的例外狀況。 斷詞工具應該執行下列函式並處理下列錯誤:
- 呼叫 IWordBreaker::Init 必須傳回 LANGUAGE_E_DATABASE_NOT_FOUND 或 S_OK。
- 呼叫 IWordBreaker::Init 成功將 pfLicense 參數初始化為 FALSE 並呼叫 IStemmer::GetLicenseToUse,而且不會產生存取違規。
- 斷詞工具不會在 IWordBreaker::BreakText 方法的 awcBuffer 參數結尾讀取。
- 呼叫 IWordBreaker::BreakText,並將 pwcInBuf 設定為 NULL。 IWordBreaker::BreakText 失敗(傳回E_FAIL),而且不會產生存取違規。
- 呼叫 IWordBreaker::BreakText,cwc 參數等於 0。 IWordBreaker::BreakText 成功傳回 (傳回S_OK),而且不會產生存取違規。
- 呼叫 IWordBreaker::BreakText方法,並將 pwcInBuf 參數設定為 NULL,而 cwc 參數等於 0。 IWordBreaker::BreakText 失敗(傳回E_FAIL),而且不會產生存取違規。
- 在索引建立期間產生的片語包含相同數目的字組。
- 詞組會在索引建立期間透過連續呼叫 IWordFormSink::PutWord 和 IWordFormSink::PutAltWord 方法產生。 斷詞工具只會在查詢期間使用 IPhraseSink 物件。
相關主題