我需要搜索 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)基于其内容作为一个整体匹配术语,即使使用""
. 由于我们几乎所有的 ISBN 都以相同的几个数字开头,并且后面的数字几乎没有变化,因此返回的匹配项太多。
有没有办法让 FREETEXT 或 CONTAINS 执行类似于 LIKE,或任何其他方式来利用全文索引进行搜索?