2013-05-27 150 views
1

我有一個標籤(單詞)表。每次我想在表格中添加一個新的項目(單詞)時,我想首先看到最接近我所輸入單詞的單詞,這樣我就可以意識到我已經在表格中看到了一個單詞。尋找最匹配的詞

有點像在Mysql中使用match()函數,但我不想要多少個單詞對應的分數。但是在一個單詞中有一個分數,有多少個字符對應。

因此,像:select * from tags order by look_a_like_score(@newword)

但是有沒有像look_a_like_score這樣的功能()?

例,我已經在表:

餐廳

電梯

游泳池

無線上網

現在我想補充:

免費游泳設施

我想什麼,現在已經是在上面「游泳池」名單,因爲部分「swimm」是最匹配。

你能幫我做這個嗎?

PS。我將整個表格收集到PHP中,然後將它們放入一個數組中。所以PHP方法也是受歡迎的。

+0

'游泳池'和'免費游泳設施'是最匹配的,因爲都有'游泳'部分。所以如果有的話,我會給它5個匹配字符的5分。任何更多/更少花式也是受歡迎的。 –

回答

3

在MySQL方面,你有soundex,並不像我喜歡的那樣工作得很好。 你可能想要實現一個MySQL模塊來使用levenshtein(你也需要用C編譯)。

在PHP端你已經萊文斯坦(),可這是相當不錯的有相似性分數

您可能也使用:

同音() - 計算字符串

similar_text的同音關鍵() - 計算兩個串

音位()之間的相似性 - 計算一個字符串的變音位鍵

查看使用手冊以瞭解如何使用它們

+0

我不熟悉levenshtein。但我已經可以說soundex不是我要找的東西了。我會直接在php的similar_text()中查看。誰知道......也許這就是我要找的 –

+0

看着Levenshtein,它看起來有點像我想要的。我想知道你爲什麼把你的答案從'使用levenshtein'改爲'在c中編譯'。是不是levenshtein可以直接在mysql中使用? –

+0

如果你使用單詞,levenshtein()肯定會好得多,similar_text()對於長文本更好(但是通過構造算法比levenshtein慢得多) –

0

沒有功能。但是,你可以用一些SQL來做到這一點。讓我假設@新標籤包含您的新標籤,並且您有一個numbers表。你可以這樣做:

select t.tag, max(len) as biggestmatch 
from (select concat('%', substr(@newtag, n1.n, n2.n), '%') as pat, 
      n1.n as start, n2.n as len 
     from numbers n1 cross join 
      numbers n2 
     where n1.n <= length(@newtag) and n1+n2 <= length(@newtag) 
    ) patterns join 
    tags t 
    on t.tag like patterns.pat 
group by t.tag 
order by max(len) 
limit 1 /* you only need this if you want the best one */ 

我不會承諾,這將表現特別好。但是對於一些不太長的標籤和字符串,它可能適合你的目的。