2012-10-23 23 views
1

我正在嘗試使用SQL執行搜索查詢;我的頁面包含一個輸入字段,其值被採用並簡單地連接到我的SQL語句。SQL搜索George vs. Georges

因此,Select * FROM users搜索後變成SELECT * FROM users WHERE company LIKE '%georges brown%'

然後根據用戶輸入的內容返回結果;在這種情況下,喬治布朗。然而,它只能找到那些公司被正式命名爲喬治布朗(帶有's')的條目。

我想要做的是返回一個結果集,不僅包含喬治和喬治(沒有')的條目。

有沒有什麼辦法可以讓這個搜索更加靈活,從而找到喬治和喬治的結果?

+0

是你硬編碼棕色喬治,或者是用戶輸入的數據?如果它是用戶提供的,則必須像谷歌那樣建立一個翻譯列表。 「你的意思是xxx?」 –

+0

它是用戶輸入的數據。 – mousesports

回答

1

嘗試使用更多通配符george

SELECT * FROM users WHERE company LIKE '%george% %brown%' 
0

嘗試此查詢:

SELECT * 
FROM users 
WHERE company LIKE '%george% brown%' 
0

在特定情況下,你可以使用通配符:

WHERE company LIKE '%george% brown%' -- will match `georges` but not `georgeani` 

_是單字符通配符,而%是一個多字符通配符。

但也許最好使用另一個軟件索引,如Sphinx。 。

它具有: 「靈活的文本處理獅身人面像索引功能包括SBCS和UTF-8編碼(這意味着有效的所有全球語言支持)的全力支持;停用詞移除和可選的命中位置去除(無中斷索引);通過詞形詞典和詞幹分析器形態學和同義詞處理;異常和混合字符等等。「

它可以讓你做更智能的搜索與部分匹配,同時提供比soundex更準確,例如。

+0

不幸的是,當我嘗試添加'_'作爲單字符通配符時,它不會返回'George Brown'的任何結果。它只返回'喬治布朗'的結果。 – mousesports

+0

當然。我傻了。 '_'完全匹配*一個字符。所以雖然它可能有它的用途,但在這裏沒有用。修改了查詢。 – GolezTrol

0

您必須查看數據庫系統的文檔。 MySQL例如提供SOUNDEX函數。

否則,應該始終如一地工作,讓您更好地匹配,只能在上下套用的字符串上工作。 SQL-92定義了TRIM,UPPERLOWER函數。所以你會做一些像WHERE UPPER(company) LIKE UPPER('%georges brown%')

0

可能最好將您的搜索字符串分解爲單個單詞,然後找到每個單詞的複數/單數。然後爲每個詞做兩個可能性。

但是這是對大量數據,你可能要對鏈接到每個公司字表運行可用地高效。單獨

探測法可能是沒有多大用處,因爲太多的話是相似的(它爲您提供了一個4字符代碼,第一個字符是單詞的第一個字母,而在未來3是一個數字代碼)。 Levenshtein更準確,但MySQL沒有內置的方法,儘管php確實有一個快速函數(我發現計算它的MySQL函數太慢而無法在大型搜索中使用)。

我爲類似的搜索功能所做的就是取出輸入字符串並將其分解爲單詞,然後將這些單詞轉換爲單數形式(我用過的單詞表中只包含單數形式的單詞)。對於每一個單詞,我都會找到所有使用的單詞,然後使用levenshtein來獲得最佳匹配。並從中列出了可能的匹配。可以應付這些錯誤(如果有人進入了Goerge,可能會發現George),並找到最佳匹配(即,如果有人搜索了5個字,但只有4個被發現)。如果拼寫數英里外,也可以想出幾個替代方案。

您可能還需要查找音位和雙音位。

+0

將字符串分解爲單個單詞並進行比較是我在這種情況下所做的 - 我沒有處理大量數據。謝謝你的評論。 – mousesports