簡體   English   中英

使用模糊匹配搜索單個 MySQL 文本列

[英]Searching a single MySQL text column with fuzzy matching

我有一個 MySQL InnoDB 表,其中包含一個“名稱”列 (VARCHAR(255)),我希望用戶能夠對其進行搜索,並返回所有匹配的行。 但是,我不能只使用 LIKE 查詢,因為搜索需要允許用戶輸入與可用名稱相似的名稱(例如,以“The”為前綴,或者不知道正確的名稱包含撇號)。

兩個例子是:

DB 中的名稱:“玫瑰與皇冠”

應匹配的可能搜索示例:“Rose & Crown”、“Rose and Crown”、“rose and Crown”、“The Rose and Crown”

DB中的名稱:“潛水員旅館”

應匹配的可能搜索示例:'Divers' Inn'、'The Diver's Inn'、'Divers Inn'

我還希望能夠通過“最接近的匹配”相關性對結果進行排名,盡管我不確定如何做到這一點(也許是編輯距離?)。

該表不太可能超過幾千行,因此不擴展到數百萬行的方法是可以的。 一旦輸入,給定行的名稱值將不會改變,因此如果需要昂貴的索引操作,這不是問題。

是否有執行此任務的現有工具? 我看過 Zend_Search_Lucence,但它似乎專注於文檔,而我只對搜索單個列感興趣。

編輯:在 SOUNDEX 搜索中,這不會產生我想要的結果。 例如:

SELECT soundex( 'the rose & crown' ) AS soundex1, soundex( 'rose and crown' ) AS soundex2;
soundex1    soundex2
T6265   R253265

解決方案:最后我使用了 Zend_Search_Lucence ,只是假裝每個名字實際上都是一個文檔,這似乎達到了我想要的結果。 我猜它在某種程度上是全文搜索,即使每個字符串最多 3-4 個單詞。

全文搜索 (FTS) 是您想要的數據庫功能的術語。 有:

這是一個非常接近您想要的問題的問題。 雖然答案適用於 PHP 和 MySQL,但一般原則仍然適用:

如何將 MYSQL 中的公司名稱與 PHP 進行模糊匹配以自動完成?

基本上你會使用 SOUNDEX 來得到你想要的。 如果您需要更大的功率、更長的琴弦等,您可能需要研究 Double Metaphone,這是對 Metaphone 和 SOUNDEX 的改進:

http://aspell.net/metaphone/

http://www.atomodo.com/code/double-metaphone

暫無
暫無

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

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