文檔說明

同義詞搜索

人類語言文化豐富,同一個意思有無數種不同的表達方式。因此,同義詞 是全文檢索中非常重要和必要的一項基礎功能。從 1.3.0 版本起,Xunsearch 開始提供同義搜索搜索功能。

1. 什么是同義詞搜索

為了更好的提升用戶搜索體驗,我們希望用戶在搜索“浙江大學”的時候也同時匹配包含縮寫“浙大”的結果, 這就是所謂的同義詞搜索。通常我們說“浙大”是“浙江大學”的同義詞,前者是常用縮寫,后者是標準詞(原詞)。

同義詞搜索 完全依賴于您事先設置好的同義詞庫,詞庫內每條記錄由“標準詞(原詞)”和“同義詞”組成, 它們都必須是獨立的詞匯,也就是最小的索引單位,不可以是多個詞組成的短語。

Tip: 獨立詞匯的意思對于英文來說就是一個單詞,對于中文來說必須是 scws 詞庫中的一個詞。
Xunsearch 的同義詞不同于 Xapian,會智能進行字段匹配和轉換,您只需維護通用詞庫。

2. 英文同義詞的特殊處理

英文單詞的同義詞在 xunsearch 中做了一些個特殊處理:

  • 統一小寫 統一轉換為小寫字母進行存儲,不支持必須保留大寫字母的同義詞。

  • 同根詞支持 英語同一個單詞有多種不同的形式,如:單復數、過去式和現在分詞等。 而它們要傳送的其實是同一種涵義。因此,對于純英文的同義詞記錄會自動進行詞根處理。 詞根記錄保存為大寫字母 Z 開頭的記錄。例如:

    設置 findsearch 的同義詞,那么檢索 searching 時如果 searching 本身沒有同義詞,那么也會匹配包含 findingfinds 等同根詞的結果。

  • 復合詞支持 支持對多個單詞組成的短語設置同義詞,詞之間用一個半角空格分開, 但同義詞仍然只允許一個單詞或中文詞哦。如:

    設置 您好hello world 的同義詞,那么檢索 hello world ok 時也會匹配同時包含 您好ok 的記錄。

3. 管理同義詞庫

您可以通過 XSIndex::addSynonymXSIndex::delSynonym 來添加和刪除同義詞記錄。 多次調用這兩個接口函數的時候支持使用索引緩沖區來提高效率。

參數 $raw 是字符串,表示記錄中的原詞(標準詞),$synonym 也是字符串,表示記錄中的同義詞, 對于刪除操作可以省略該參數表示清空原詞的所有同義詞。

以下為示例代碼,其中的 $index 變量是索引操作對像,參見如何開始使用索引?

// 給 "搜索" 增加 "檢索" "查找" 兩個同義詞
$index->addSynonym('搜索', '檢索');
$index->addSynonym('搜索', '查找');
 
// 給 "Hello world" 增加同義詞 "你好"
$index->addSynonym('hello world', '你好');
 
// 刪除 search 的全部同義詞
$index->delSynonym('search');
 
// 刪除 "搜索" 的同義詞 "檢索"
$index->delSynonym('搜索', '檢索');

除了調用 API 外,您還可以使用 Indexer 索引管理工具 進行同義詞管理。

4. 查看已有同義詞庫

通過 XSSearch::getAllSynonyms 來獲取當前索引庫內的全部同義詞記錄,返回一個數組, 以原詞(標準詞)為鍵,其同義詞列表為值。

以下為示例代碼,其中的 $search 變量是搜索操作對像,參見如何開始使用搜索?

// 獲取當前庫的前 100 個同義詞記錄
$synonyms = $search->getAllSynonyms();
 
// 獲取當前庫第 6~15 條同義詞記錄
$synonyms = $search->getAllSynonyms(10, 5);
 
// 查看包含隱藏同義詞根在內的前 20 條記錄
$synonyms = $search->getAllSynonyms(20, 0, true);

除了調用 API 外,您還可以使用 Quest 搜索工具 進行同義詞管理。

5. 使用同義詞搜索功能

同義詞搜索默認是不開啟的,如果您打算使用同義詞搜索,這部分功能隸屬于構建搜索語句

在設置查詢語句 XSSearch::setQuery 之前調用 XSSearch::setAutoSynonyms 來開啟同義詞功能。

// 假設”搜索“有且僅有一個同義詞”檢索“
// 開啟同義詞搜索,輸出:
// Xapian::Query(((搜索:(pos=1) SYNONYM 檢索:(pos=89)) AND 世界:(pos=2)))
$search->setAutoSynonyms()->setQuery('搜索世界')->getQuery();
 
// 開啟同義詞搜索,并帶有字段效果,假設 subject 是項目的第二個字段,輸出:
// Xapian::Query(((B搜索:(pos=1) SYNONYM B檢索:(pos=89)) AND B世界:(pos=2)))
$search->setAutoSynonyms()->setQuery('subject:搜索世界')->getQuery();
 
// 關閉同義詞搜索,輸出:
// Xapian::Query((搜索:(pos=1) AND 世界:(pos=2)))
$search->setAutoSynonyms(false)->setQuery('搜索世界')->getQuery();

Tip: 您可以分別在開啟/關閉同義詞功能的條件下,對比 XSSearch::getQuery 查詢語句分析結果。

$Id$

一條評論!

#120 報告
特拉法爾加羅 at 2017-12-06 10:10:02
同義詞搜索指定字段類型為full

同義詞搜索指定字段,該字段的分詞方式tokenizer 是full類型,那么無法使用同義詞查詢功能嗎

請到論壇 登錄 后刷新本頁面!

小蜜蜂网络兼职