2

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

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

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

4

4 回答 4

3

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

于 2013-04-09T22:43:55.803 回答
2

检查以下查询,

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

或者

select * 
from tablename 
where  Replace(ColumnName,'''','') like '%obrien%'
于 2013-04-09T15:10:06.270 回答
2

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

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

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

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

于 2013-04-10T11:54:16.837 回答
-2

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

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

于 2013-04-09T15:20:00.487 回答