使用 CONTAINS 搜索文本
Searching text using CONTAINS
使用 CONTAINS
,我正在搜索单词“text\
”后跟任何字符串:
select * from table1
where CONTAINS (availableText, 'TEXT\%')
但是,此查询 returns 会命中“TEXT
”字符串之前的文本;例如,这是一个错误命中:'there is no text available
'.
正在寻找一种方法来获得像“TEXT\path\...
”这样的点击,而不是“dir\TEXT\path\..
”。
我知道如何使用 LIKE
执行此操作,但更喜欢 CONTAINS
。
我怀疑使用 CONTAINS 是否可行。
CONTAINS内部使用了一个全文索引(一种可以想象为一组文本的所有单词的大索引的结构)。这就是为什么在大多数情况下 CONTAINS 比 LIKE 快得多的原因,因为它可以在全文索引中查找您查询的词,并检索到包含该词的文本的行的相应键(s).
LIKE 扫描所有行(如果“%”是查询的开头)或至少扫描查询列上的索引(如果查询不是以通配符开头)。
在您的情况下,我建议在 (n)varchar 列上创建索引并使用 LIKE,因为您正在进行基于前缀的搜索。
如果您确实想使用 CONTAINS,您可能想先使用该运算符,然后在该受限结果集上使用 LIKE。
使用 CONTAINS
,我正在搜索单词“text\
”后跟任何字符串:
select * from table1
where CONTAINS (availableText, 'TEXT\%')
但是,此查询 returns 会命中“TEXT
”字符串之前的文本;例如,这是一个错误命中:'there is no text available
'.
正在寻找一种方法来获得像“TEXT\path\...
”这样的点击,而不是“dir\TEXT\path\..
”。
我知道如何使用 LIKE
执行此操作,但更喜欢 CONTAINS
。
我怀疑使用 CONTAINS 是否可行。 CONTAINS内部使用了一个全文索引(一种可以想象为一组文本的所有单词的大索引的结构)。这就是为什么在大多数情况下 CONTAINS 比 LIKE 快得多的原因,因为它可以在全文索引中查找您查询的词,并检索到包含该词的文本的行的相应键(s). LIKE 扫描所有行(如果“%”是查询的开头)或至少扫描查询列上的索引(如果查询不是以通配符开头)。
在您的情况下,我建议在 (n)varchar 列上创建索引并使用 LIKE,因为您正在进行基于前缀的搜索。 如果您确实想使用 CONTAINS,您可能想先使用该运算符,然后在该受限结果集上使用 LIKE。