需要全文搜索功能类似于LIKE%...%

时间:2013-08-30 15:20:21

标签: sql user-defined-functions

我需要搜索ISBN列并允许返回部分匹配。使用LIKE是准确但很慢,大约2-3秒:

select * from Isbns where isbn like '%1234567890123%'
-- returns 1 result: 1234567890123

select * from Isbns where isbn like '%12345678%'
-- returns 2 results: 1234567890123, 1234567811111.

使用全文索引,搜索是即时的,但是返回的结果太多。

select * from Isbns where freetext(isbn, '"1234567890123"')
-- returns thousands of results, such as the exact match of 1234567890123, 
-- but also fuzzy matches such as: 1234567770123, 1234567778883, etc.

您可以看到主要区别在于LIKE在术语的开头和结尾基于通配符进行匹配,而FREETEXT(以及CONTAINS)根据其内容整体匹配术语,即使用{{1 }}。由于几乎所有的ISBN都以相同的数字开头,并且在以下数字中几乎没有差异,因此返回的匹配太多。

有没有办法让FREETEXT或CONTAINS执行类似于LIKE或任何其他方式来利用全文索引进行搜索?

1 个答案:

答案 0 :(得分:0)

如果您的所有ISBN都以相同的数字开头,请在字符串的开头留下通配符:

select *
from Isbns
where isbn like '12345678%';

然后确保您在isbns(isbn)上有索引。许多数据库在以常量开始时会优化like