0

我需要搜索 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,或任何其他方式来利用全文索引进行搜索?

4

1 回答 1

0

如果您的所有 ISBN 都以相同的几个数字开头,请不要在字符串开头使用通配符:

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

然后确保你有一个索引isbns(isbn)。许多数据库会在like以常量开头时进行优化。

于 2013-08-30T15:24:14.200 回答