Mår*_*und 2 sql-server full-text-search sql-server-2008-r2
我在名为 Filecontent 的列上有一个带有全文索引的表。该表有一行内容包含“W 917”。对于上下文,此行上的内容列包含的不仅仅是我要搜索的内容。
我不明白为什么我会得到不同的结果,这取决于我使用的是包含、包含通配符还是自由文本。为什么不带通配符的 CONTAINS 得到结果,而带通配符的 CONTAINS 却没有?
-- Searching for "W 917"
-- No match - CONTAINS with wildcard
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W 917*"')
-- Match - CONTAINS
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W 917"')
-- Match - FREETEXT
SELECT * FROM InvoicePDFContent t1 WHERE FREETEXT(t1.Filecontent, '"W 917"')
-- Searching for "W"
-- Match - CONTAINS with wildcard
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W*"')
-- No match - CONTAINS
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W"')
-- No match - FREETEXT
SELECT * FROM InvoicePDFContent t1 WHERE FREETEXT(t1.Filecontent, '"W"')
´´´
Run Code Online (Sandbox Code Playgroud)
差异是由噪声词“W”引起的。默认情况下,SQL Server 使用停止列表来排除一些简短或常用的词,如“and”、“does”、“could”。您可以使用这样的查询查看完整列表:
select * from sys.fulltext_system_stopwords where language_id = 1033
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以禁用全文索引的停止列表。
现在让我们来看看您的查询:
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W*"')
Run Code Online (Sandbox Code Playgroud)
这将查找包含以“W”开头的单词的所有行,并且这些单词不应出现在您的停止列表中。
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W"')
Run Code Online (Sandbox Code Playgroud)
此查询不返回任何内容,因为您正在查找停用词。
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W 917"')
Run Code Online (Sandbox Code Playgroud)
此查询仅忽略 W 并查找“917”。
SELECT * FROM InvoicePDFContent t1 WHERE CONTAINS(t1.Filecontent, '"W 917*"')
Run Code Online (Sandbox Code Playgroud)
这是最有趣的案例。根据 SQL Server 文档:
当 <prefix_term> 是一个短语时,该短语中包含的每个单词都被认为是一个单独的前缀。因此,指定前缀词为“local wine*”的查询与文本为“local winery”、“locally wined and dined”等的任何行匹配。
这意味着实际上您正在寻找连续有两个单词的短语。第一个像“W*”(但它不应该在停止列表中),第二个是“917*”。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |