MySQL LIKE %string%不够宽容.任何我能用的东西



我有一个客户谁问他们的搜索,其中搜索公司名称,可以根据用户输入以几种格式搜索,例如存储在数据库中的公司是a J R Kelly Ltd,如果用户搜索"a J R Kelly"它被发现,使用;

<cfif pctermsCount gt 0>
AND (LOWER(p.name)  LIKE '%#pcTerms#%')
</cfif>

如果他们搜索"Kelly",可以找到公司,但如果他们搜索字符串的破碎版本,如"a J Kelly"或"AJ Kelly",则无法找到。

我能做些什么让它更宽容一点吗?

谢谢。

如果您正在使用MyISAM,则可以使用全文索引。参见本教程

如果你使用不同的存储引擎,你可以使用第三方的全文引擎,如sphinx,它可以作为mysql的存储引擎或一个可以查询的独立服务器。

使用MySQL全文索引,对A J Kelly的搜索将匹配AJ Kelly(不要混淆问题,但a, J和AJ将被忽略,因为它们默认太短,它将匹配Kelly)。一般来说,全文更容易原谅(通常比LIKE '%string%'更快),因为允许部分匹配,然后可以根据相关性进行排名。

您还可以使用SOUNDEX通过索引单词的语音等同物并通过在搜索词上应用SOUNDEX进行搜索,然后使用这些搜索索引,从而使搜索更加宽容。使用soundex, marymariemarry将全部匹配,例如

如果你确实在运行ColdFusion,你可以使用Verity或Solr/Lucene访问CF的全文索引。这两种方法都可以为字符串提供良好的"模糊匹配"能力。

使用MyISAM表对于全文索引来说是一颗苦药——你放弃了很多安心的事情,以及像外键约束之类的东西。

您可以创建一个新列,并通过删除空格使其成为名称的可搜索版本,然后将列数据类型设置为FULLTEXT(仅适用于MyISAM)。你可能也想看看Lucene/SOLR。SOLR提供了许多标记器,它们在这种情况下工作得非常好。学习曲线相当高,但从长远来看是值得的。

很棘手,我想一个简单的方法是在数据库术语搜索中删除空白,所以使用AJRKelly而不是AJRKelly。然后使用空白作为单个搜索词的分隔符。这样A J Kelly就会分别搜索A J和Kelly。AJ Kelly会分别搜索AJ和Kelly。它们将匹配AJRKelly空白删除的数据库术语。

相关内容

最新更新