Postgresql

PostgreSQL 中的全文搜尋,搜尋詞包括不相關的連字元和結尾

  • July 31, 2018

我的數據庫(PGSQL 9.6)中有一個我無法解決的問題,我什至不明白我可能有哪些選項(如果有的話)。簡化我有一個多語言新聞文章數據庫,我在其中創建了標題和文本的全文搜尋索引 (tsvector)。我需要在數據庫中搜尋以查找具有特定遊戲名稱的文章。

與我所做的匹配的索引範例:

SELECT to_tsvector('simple', 'Yakumo Shionome featured in new Code Vein-trailer');

這會產生以下全文搜尋索引:

‘code’:6 ‘features’:3 ‘in’:4 ’new’:5 ‘shionome’:2 ’trailer’:9 ‘vein’:8 ‘vein-trailer’:7 ‘yakumo’:1

當我想搜尋“程式碼靜脈”作為遊戲名稱時,挑戰就來了。在這種情況下,我通常會使用“phraseto_tsquery”。原始測試查詢可能與此類似:

SELECT to_tsvector('simple','Yakumo Shionome featured in new Code Vein-trailer') 
 @@ phraseto_tsquery('simple','Code Vein');

在這種情況下,這將導致 FALSE。我必須搜尋“Code Vein-Trailer”才能獲得真正的匹配。所以“連字元”後面跟著“一些詞”本質上給我帶來了麻煩,我真的不知道我可能有什麼選擇來解決這個問題(可能有很多不同的結尾詞,很多我也可能不知道提前)。

通常,我的布爾搜尋是基於單詞邊界的這一事實很好,因為它可以避免潛在的誤報,但這似乎是一個具有挑戰性的缺點。我使用“簡單”是因為有多種語言,而且我有時會搜尋包含停用詞的遊戲名稱和元素——如果不採用這種方法,我覺得最終會出現問題或更容易解決問題。我也確實需要完全匹配而不是排名結果。

歡迎任何想法和幫助。

問題是令牌’vein-trailer’被發出並位於裸令牌’vein’之前,因此位於’code’和’vein’之間。

解決此問題的一種方法是創建一個不發出連字元的新文本搜尋配置:

create text search configuration simple2 (copy=simple);
alter text search configuration simple2 drop mapping for asciihword;

然後以下返回 true:

select 
 to_tsvector('simple2','Yakumo Shionome featured in new Code Vein-trailer') 
 @@
 phraseto_tsquery('simple2','Code Vein');

這是否會解決您的所有問題,或產生新問題,根據您的描述很難判斷,也很難憑直覺判斷,但它確實解決了您提出的字面問題。您可能還需要使用非 ascii hwords 做一些事情。

引用自:https://dba.stackexchange.com/questions/213677