2015-10-02 73 views
2

我在兩臺運行Postgres 9.4.4的獨立數據庫服務器上測試了文本搜索查詢。相同tsvector Postgres ts_rank_cd不同的結果?

有問題的行具有相同的數據,我也得到了相同的底層tsvector兩臺服務器上:

SELECT 
    user_id, 
    TO_TSVECTOR('english', REGEXP_REPLACE(first_name, '[^a-zA-Z0-9]', ' ', 'g')) || 
    TO_TSVECTOR('english', REGEXP_REPLACE(last_name, '[^a-zA-Z0-9]', ' ', 'g')) || 
    TO_TSVECTOR('english', REGEXP_REPLACE(username, '[^a-zA-Z0-9]', ' ', 'g')) 
FROM users_v1 where user_id = 123; 

-- On server A: 
-- user_id | to_tsvector 
-- -----------+---------------------- 
-- 123  | 'georg':1 'hickman':2 
-- (1 row) 

-- On server B: 
-- user_id | to_tsvector 
-- -----------+---------------------- 
-- 123  | 'georg':1 'hickman':2 
-- (1 row) 

但是我用這個載體來運行一個查詢時,得到不同的等級:

SELECT username, 
TS_RANK_CD(
    TO_TSVECTOR('english', REGEXP_REPLACE(first_name, '[^a-zA-Z0-9]', ' ', 'g')) || 
    TO_TSVECTOR('english', REGEXP_REPLACE(last_name, '[^a-zA-Z0-9]', ' ', 'g')) || 
    TO_TSVECTOR('english', REGEXP_REPLACE(username, '[^a-zA-Z0-9]', ' ', 'g')) 
, PLAINTO_TSQUERY('george')) 
FROM users WHERE user_id = 123; 

-- On server A: 
-- user_id | ts_rank_cd 
-- -----------+---------------------- 
-- 123  | 0.2 
-- (1 row) 

-- On server B: 
-- user_id | ts_rank_cd 
-- -----------+---------------------- 
-- 123  | 0.0 
-- (1 row) 

矢量是否是排名函數的唯一輸入,或者是否存在影響ts_rank_cd行爲的任何服務器設置/其他任何內容?存儲在向量中的所有信息都顯示在控制檯輸出中,還是存在一些我沒有看到的隱藏差異?如果不是可能導致差異的原因?

+1

PLAINTO_TSQUERY('george')'在每個系統上顯示什麼? – jjanes

+0

啊哈,有區別!它在系統上返回'georg',給出0.2的等級,但是在另一個系統上的'george'。謝謝。所以我想這是由不同的文本搜索配置引起的,就像這裏一樣? http://www.postgresql.org/docs/9.4/static/textsearch-configuration.html – actionshrimp

回答

0

感謝jjanes的評論,我意識到PLAINTO_TSQUERY也接受可選參數來指定文本搜索配置。這樣做

SELECT PLAINTO_TSQUERY('george'); 

在另一個系統和georg上返回george,但這樣做

SELECT PLAINTO_TSQUERY('english', 'george'); 

返回上都相同,造成了預期的排名。這樣做

SHOW default_text_search_config; 

透露pg_catalog.english設定爲在另一個系統和pg_catalog.simple上的默認。然後可以通過在創建TSQUERY時顯式傳遞配置來修復差異,或者更新默認配置,以使它們在兩個數據庫中都相同。