使用ICU邊界分析的PostgreSQL文本搜索解析器
全文搜索的第一階段是解析 - 將文檔和查詢文本打破單個令牌(不同的單詞,數字等)。但是,在某些語言中,此任務並不那麼微不足道。最突出的例子是東亞語言(例如中文,日語,韓語等) - 通常,言語通常不會被空間和標點符號隔開。另一個例子是希伯來語。雖然單詞被標點符號隔開,但某些字符可能被視為標點符號,或者不取決於上下文。
PostgreSQL的全文搜索子系統隨附的默認解析器在這些情況下提供了相當不滿意的結果。 pg_icu_parser是一個擴展程序,它提供了一種自定義的全文搜索解析器實現,該實現使用ICU Word邊界分析例程從源文本中提取令牌。這些實現了Unicode標準附件29中指定的算法,並可以在許多語言上提供合理的結果。
當前必須從源代碼構建pg_icu_parser 。確保可用的PostgreSQL有開發支持文件(標題等)。
要構建和安裝,請運行:
$ make install
這將違反並安裝到當前路徑中的pg_config的第一個實例確定的PostgreSQL安裝中。針對特定的安裝(或一個不在路徑中):
$ make install PG_CONFIG=/path/to/pg_config
該擴展名也可在PGXN中獲得。
要將擴展名加載到數據庫中,請作為具有合適權限的用戶執行以下SQL命令:
CREATE EXTENSION pg_icu_parser;這將在當前架構中註冊自定義文本解析器。為了使用它,必須如PostgreSQL手冊中所述創建文本搜索配置。例如:
CREATE TEXT SEARCH CONFIGURATION sample (parser = icu_parser);
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR word WITH english_stem;
ALTER TEXT SEARCH CONFIGURATION sample ADD MAPPING FOR number , ideo, kana WITH simple;可以通過解析器發射的令牌類型是word , number , kana , ideo和blank這些類型與ICU支持的單詞斷路標籤保持一致。對於可以使用哪些字典沒有限制。
pg_icu_parser公開一個配置參數:
pg_icu_parser.locale字符串,可選。與邊界分析例程一起使用的ICU區域。如果未設置,則默認為en 。通常,不需要設置此參數,因為沒有對語言環境敏感的單詞邊界檢測規則。 如上所述, pg_icu_parser與已內置在PostgreSQL中的default解析器的主要優勢是各種語言中更好的令牌化結果。此外, pg_icu_parser不取決於數據庫的語言環境設置或用於確定字母的基礎操作系統。
但是,有幾個權衡要意識到這會影響決策是否適合pg_icu_parser用例:
默認解析器可以識別多種模式,例如令牌,包括URL,電子郵件地址,各種不同種類的數字值等。另一方面, pg_icu_parser標記類型要少得多(並且支持的少數人更粗糙),並且無法檢測到任何復雜的模式。
目前, pg_icu_parser不支持ts_headline函數。也許將來...
pg_icu_parser比default解析器慢得多。但是,如果數據庫的服務器編碼為UTF-8,則使用快速路徑,從而減少開銷。請參閱下面的基準部分。
作為第三方擴展程序,只有在可以完全控制PostgreSQL安裝的地方,才能使用pg_icu_parser ;也就是說,它可能無法與託管的PostgreSQL解決方案一起使用。
以下非科學基準可以使人對使用pg_icu_parser而不是默認解析器所期望的速度降低多少。經過測試的方案是計算語料庫中每個文檔中非空白令牌數量的查詢。使用的語料庫是Haaretz語料庫,由27,139個簡短的希伯來語文章組成。值是10發毫秒的平均執行時間,如說明EXPLAIN ANALYZE所報導:
| 服務器編碼 | default | pg_icu_parser | 減速 |
|---|---|---|---|
| UTF-8 | 2,566.9974 | 2,884.3696 | -12.3% |
| ISO-8859-8 | 3,529.6487 | 5,059.3616 | -43.3% |
當然,不同的環境和不同的語料庫可能會產生不同的結果,YMMV。
pg_icu_parser已獲得Mozilla公共許可2.0的許可。