2009-07-30 139 views
4

我想在PostgreSQL 8.3中進行全文搜索。它工作出色,所以我使用同義詞詞典添加了同義詞匹配(例如'bob'=='robert')。這也很好。但我注意到它顯然只允許一個詞有一個的同義詞。也就是說,'al'不能是'albert'和'allen'。PostgreSQL全文搜索中的多個同義詞字典匹配

這是正確的嗎?有沒有辦法在PostgreSQL同義詞字典中有多個字典匹配?

供參考,這是我的樣本字典文件:

bob robert 
bobby robert 
al  alan 
al  albert 
al  allen 

以及創建全文搜索配置的SQL:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname); 
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple); 
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple; 

我在做什麼錯?謝謝!

回答

4

這是限制同義詞的工作方式。你可以做的是把它周圍,如:

bob robert 
bobby robert 
alan al 
albert al 
allen al 

它應該給相同的最終結果,這是一個搜索或者其中的一個將匹配同樣的事情。

+0

嗯。這有幫助,但我想這意味着沒有可能的方式來建立多對多的關係。例如,這是不可能的整頓: VIN文森特 VIN蒙特拉 維尼爾·文森​​特 溫尼蒙特拉 謝謝您的好意! – 2009-07-31 15:59:56

2

字典必須定義詞語之間的函數關係和語意,否則也不會知道什麼時候你lexize要返回的字。在你的例子中,al映射到三個不同的值,從而定義一個多值函數,而lexize函數不知道要返回什麼。正如Magnus所示,您可以從專有名稱alan, albert, allen轉換爲暱稱al

但請記住,FTS字典的重點不在於執行本身的轉換,而是爲了對語義相關的單詞進行有效的索引。這意味着在任何語言意義上,詞位不需要與原始條目相似。雖然你認爲多對多的關係是不可能定義的,你真的需要嗎?例如,爲了解決您的vin例如:

vin  vin 
vincent vin 
vincenzo vin 
vinnie  vin 

,但你也可以這樣做:

vin  grob 
vincent grob 
vincenzo grob 
vinnie  grob 

,並得到同樣的效果(雖然你爲什麼會想是另一回事)。

因此,如果您要解析文件名稱爲Vincent的11個版本,那麼to_tsvector函數將在前一種情況下返回vin:11,在後者中返回grob:11

相關問題