我需要搜索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或任何其他方式来利用全文索引进行搜索?
答案 0 :(得分:0)
如果您的所有ISBN都以相同的数字开头,请在字符串的开头留下通配符:
select *
from Isbns
where isbn like '12345678%';
然后确保您在isbns(isbn)
上有索引。许多数据库在以常量开始时会优化like
。