如何从不包含撇号的搜索字符串返回包含撇号的查询结果

时间:2013-04-09 14:55:56

标签: sql coldfusion db2 coldfusion-7

我有一个简单的应用程序,允许用户输入字符串来搜索数据库中的名称。服务器端是ColdFusion 7.我遇到的问题是诸如“obrien”之类的查询不会返回名为“o'brien”的条目。

我认为我想要的是模糊匹配能力。在做了一些研究后,我也遇到了全文搜索,这可能是我正在寻找的;但是,我不确定两者之间的区别。 ColdFusion有一个名为verity的服务,但似乎我必须首先查询所有数据库,然后将其编入索引 - 这听起来非常昂贵。

在没有首先查询整个数据库的情况下,是否有内置的方法在ColdFusion中进行模糊匹配或全文搜索?如果没有,在进行全文搜索时,是否必须指定索引?例如,obrien应该索引“obrien,o'brien,o'brein”?

4 个答案:

答案 0 :(得分:3)

尝试使用SOUNDEX功能怎么样?我不认为这里有任何简单的答案。

答案 1 :(得分:2)

检查以下查询,

select * 
from tablename 
where  Replace(ColumnName,'''','') like 'obrien'

OR

select * 
from tablename 
where  Replace(ColumnName,'''','') like '%obrien%'

答案 2 :(得分:2)

您正在寻找具有模糊匹配功能的全文搜索,更重要的是您正在寻找这些系统提供的内置标记器。但是,您也可以使用将执行Levenshtein编辑距离匹配的SQL函数。

Verity或任何其他信息检索系统(如Lucene)都是一种解决方案,但如果您需要实时搜索,则必须不断地从原始数据中重新索引数据。如果你不需要经常重新填充Verity,这可能是一个不错的选择(尽管如此,请为你的心灵加油)。标记生成器处理从数据库和用户格式化数据,以便最终得到相同的字符串。此外,Verity在ColdFusion 7中已经过时了,所以我认为与Lucene 4相比,模糊匹配选项非常有限。

另一种选择是在sql中使用levenshtein编辑距离算法中的函数。这基本上会告诉你从一个字符串到另一个字符串需要多少次编辑。这是“模糊”匹配。例如,要将lcase(O'brien)转换为lcase(obrien),需要进行一次编辑,删除“'”。六个长度字符串的一个编辑是一个很好的匹配。要将“休”改为“琼斯”,需要进行五次编辑(更改每个字母,添加一个字母)。长度为4弦的五次编辑不是很好的匹配。 Levenshtein distance in T-SQL

最后,对于任何带有全文搜索的数据库,这将为您提供实时数据,其中包含一些令人信服的标记。它很好,因为它是如此,设置如此简单。我不确定DB2是否支持模糊匹配。 SQL Server没有。

答案 3 :(得分:-2)

你在这里走错了路 - 它不是你需要的模糊匹配,它是一个参数化的查询。

您可以将参数的值设置为“O'Brien”,参数将理解嵌入式撇号的功能。