1

我正在尝试使用 SQL 进行搜索查询;我的页面包含一个输入字段,该字段的值被获取并简单地连接到我的 SQL 语句。

所以,Select * FROM users经过搜索然后变成SELECT * FROM users WHERE company LIKE '%georges brown%'.

然后它根据用户输入的内容返回结果;在这种情况下乔治布朗。但是,它只查找准确输入为 Georges Brown(带有“s”)的公司的条目。

我要做的是返回一个结果集,其中不仅包含 Georges 的条目,而且还包含 George(没有's')。

有什么方法可以让这个搜索更加灵活,以便找到 Georges 和 George 的结果?

4

6 回答 6

1

尝试在george.

SELECT * FROM users WHERE company LIKE '%george% %brown%'
于 2012-10-23T14:30:55.400 回答
0

试试这个查询:

SELECT * 
FROM users 
WHERE company LIKE '%george% brown%'
于 2012-10-23T14:31:04.530 回答
0

利用SOUNDEX

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

您还可以删除最后 2 个字符并获取 SOUNDEX 代码并进行比较。

于 2012-10-23T14:32:43.760 回答
0

在特定情况下,您可以使用通配符:

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

_是单字符通配符,而%是多字符通配符。

但也许最好使用其他软件进行索引,例如Sphinx

它具有: “灵活的文本处理。Sphinx 索引功能包括对 SBCS 和 UTF-8 编码的完全支持(这意味着实际上支持世界上所有的语言);停用词删除和可选的命中位置删除(无命中索引);通过单词处理形态和同义词形成字典和词干分析器;例外和混合字符;等等。”

例如,它允许您使用部分匹配进行更智能的搜索,同时提供比 soundex 更高的准确性。

于 2012-10-23T14:33:44.587 回答
0

您必须查看数据库系统的文档。例如 MySQL 提供了该SOUNDEX功能。

否则,应该始终有效并为您提供更好匹配的是仅适用于大写或小写字符串。SQL-92 定义了TRIMUPPERLOWER函数。所以你会做类似的事情WHERE UPPER(company) LIKE UPPER('%georges brown%')

于 2012-10-23T14:35:39.227 回答
0

可能最好将您的搜索字符串分解为单个单词,然后找到每个单词的复数/单数。然后对每个单词的两种可能性都点赞。

然而,为了在处理大量数据时有效,您可能希望针对与每个公司链接的单词表运行。

单独的 Soundex 可能没有太多用处,因为太多的词是相似的(它给你一个 4 个字符的代码,第一个字符是单词的第一个字符,而接下来的 3 个是数字代码)。Levenshtein 更准确,但 MySQL 没有内置的方法,尽管 php 确实有一个快速的函数(我发现计算它的 MySQL 函数太慢,无法在大型搜索中使用)。

我为类似的搜索功能所做的是获取输入字符串并将其分解为单词,然后将这些单词转换为它们的单数形式(我使用的单词表只包含单词的单数版本)。对于每个单词,我找到所有以相同字母开头的单词,然后使用 levenshtein 来获得最佳匹配。并从中列出可能的匹配项。可以处理拼写错误(因此如果有人输入 Goerge,它可能会找到 George),也可以找到最佳匹配项(即,如果有人搜索了 5 个单词但只找到了 4 个)。如果拼写距离很远,也可以提出一些替代方案。

您可能还想查找 Metaphone 和 Double Metaphone。

于 2012-10-23T15:19:25.337 回答