簡體   English   中英

口音敏感的全文搜索(MySQL)

[英]Accent sensitive FULL TEXT search (MySQL)

希望我看不到森林,但是我的全文搜索行為很奇怪,我自己無法解決。 (我試圖尋找解決方案,但到目前為止還算不上運氣,因此,非常感謝您的幫助。)

所以我的問題是:如果我搜索“ tök ”(在匈牙利語中表示“ pumpkin”),則列表中還包含帶有“ tok ”的結果(即“ case”)。 如果我搜索南瓜,我顯然不想要手機殼或類似的東西。

我的系統是MySQL每個表都在InnoDB中,utf8_general_ci

這是(簡化的)查詢:

SELECT id_item,item_title,tag_name, MATCH (item_title) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS title_relevance, MATCH (tag_name) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS tag_relevance 
FROM item_translations 
WHERE NULL IS NULL 
AND (   MATCH (tile_item_title) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) OR MATCH (tag_name) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) ) 
AND id_language=1 
ORDER BY title_relevance DESC, tag_relevance DESC 
LIMIT 0,40

PS:關鍵字並不總是匈牙利語,因為該網站是多語言的,所以我需要一個相對靈活的解決方案,該解決方案可以處理大多數帶重音的字母(如果可能)

字符串比較中的相等由排序規則指定。 general會像對待自己的(拉丁)基本字符的每一個字母。 您需要指定一個排序規則,以支持要與眾不同的重音符號和變音符號。

歸類包括語言說明。 例如,對於西班牙語, n < ñ < o (而對於基本上所有其他語言, n = ñ ),對於瑞典語,您具有Y = Ü ,對於德語(和大多數歸類)來說, ß = ss ,對於匈牙利語(以及許多其他歸類) )你有o < ö

因此,對於匈牙利站點,您可能想要選擇utf8_hungarian_ci ,並且如果您的軟件可本地化為特定語言(和受眾),則可能需要調整該列的排序規則或讓管理員選擇一個排序規則。 不幸的是,對於全文搜索(與其他字符串比較(例如=order by ),您無法在查詢中即時指定排序規則,因此您需要選擇一個。

在通用的多語言站點上,大多數用戶可能希望搜索符合非常通用的英語/俄語/中文模式,如果在輸入tok時找到了tök ,也不會感到驚訝。 他們甚至可能會生氣而沒有得到這些,特別是如果他們的鍵盤上沒有ö並實際上想購買南瓜(並且知道匈牙利的意思)。 大多數搜索引擎實際上將盡量不要太狹窄,並希望找到café ,當你進入cafe ,並經常把一些工作納入能夠找到café ,當你進入coffeecaffécafée

但是,沒有一種語言能處理不同的口音和變音符號。 如果您確實想區分每個特殊字符,則可以嘗試utf8_bin (盡管我不確定是否將其稱為最靈活的 )。 重要的是要注意它區分大小寫,但是由於全文搜索始終不區分大小寫,因此這無關緊要。 如果您在本專欄做其他字符串比較(如like ),這可能是有問題的,但。 同樣,您將失去特定於語言的行為,例如Y = Üß = ss (除非您自己實現)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM