MySQL:如何搜索拼写变体? (“默里”,“默里”等)

时间:2009-07-29 07:09:34

标签: php mysql

我想这样搜索:用户输入例如“murrays”,搜索结果将显示包含“murray”的记录和包含“murray”的记录。我应该在query.pl中做什么?

10 个答案:

答案 0 :(得分:5)

您如何看待使用SOUNDEX函数和SOUNDS LIKE运算符?

这样,您可以简单地执行:

SELECT * from USERS WHERE name SOUNDS LIKE 'murrays'

我很确定它并不适用于所有情况,也许它不是解决问题的最有效方法,但它可以满足您的需求。

答案 1 :(得分:3)

如果您绝对需要在SQL中执行这些查询,这将无济于事,但如果您可以为其设置Lucene搜索索引,则可以获得大量此类“模糊搜索”功能。请注意,Lucene本身就是一个非常复杂的主题。

答案 2 :(得分:3)

你可以做的是在数据库中创建一个额外的字段,其中包含从中删除所有特殊字符的数据,并在那里搜索。有点蹩脚,我知道。期待看到更明智的答案;)

答案 3 :(得分:3)

又快又脏:

SELECT * FROM myTable WHERE REPLACE(name, '\'', '') = 'murrays'

答案 4 :(得分:2)

我首先会构建一个搜索列,其中包含没有标点符号的文本,然后搜索该列。否则,您必须有一系列正则表达式来搜索或检查PHP中的单个记录以进行匹配:这两个记录都是计算密集型操作。

答案 5 :(得分:1)

也许是这样的:(未经测试!)

SELECT * FROM users WHERE REPLACE(user_name, '\'', '') = "murrays"

答案 6 :(得分:0)

如果这是单字搜索,您可以尝试使用Soundex或Metaphone功能吗?这些将处理声音和拼写

不确定MySQL是否有这些,但PHP确实如此(这需要单独的列来保存这些值)。

否则,Richy的无标点额外列似乎最好。

答案 7 :(得分:0)

您可以尝试为此查询添加替换

replace(name, '''','')

暂时摆脱比赛的撇号。

select name from nametable where name = replace(name,'''','');

答案 8 :(得分:0)

这个查询应该能够选择“murray”或“murray's”。

var inputStr = "murrays";
inputStr = String.Replace("'", "\'", inputStr);
SELECT * FROM ATable WHERE Replace(AField, '\'', '') = inputStr OR AField = inputStr

答案 9 :(得分:0)

  1. 从所有非字母字符中删除数据库中的用户输入和名称。
  2. 使用levenstein distancesoundex查找murraysmurray marrays。这是可选的,但您的用户会喜欢这样。