【发布时间】:2017-10-19 06:07:55
【问题描述】:
我有一个网络应用程序,允许用户将 Latex 内容保存到 SQL Server 2012 数据库。我正在运行如下全文查询来搜索 Latex 表达式。
SELECT MessageID, Message FROM Messages m WHERE CONTAINS (m.Message, N'2x-4=0');
我在上面的查询中面临的问题是上面查询返回的一些消息不包含乳胶表达式2x-4=0。例如,上面的查询也返回了一条保存值如下的消息。您可以清楚地看到该消息中没有包含 2x-4=0。
<p>Another example of inline Latex is \$x=34\$.</p>
<p>What are the roots of following equation: \$x^2 - 2x + 1 = 0\$?</p>
问题
为什么会发生这种情况?在进行全文搜索以查找乳胶表达式2x-4 = 0 时,有没有办法返回正确的记录?我已尝试重新填充正在使用的表的全文搜索数据,但没有效果。
更新 1
奇怪,但是下面的 Latex 表达式过滤器总是返回完全匹配的结果。我现在正在寻找$2x-4=0$ 而不是2x-4=0。
SELECT MessageID, Message FROM Messages m WHERE CONTAINS (m.Message, N'$2x-4=0$');
我的应用程序中有两种类型的乳胶表达式分隔符:$$ 用于段落显示和\$ 用于乳胶表达式的内联显示,因此数据库中存储的乳胶表达式周围总会有一个 $ 符号,虽然尾随分隔符可能是\$,但全文搜索似乎忽略了反斜杠字符。
我不清楚为什么这个修改后的查询返回完全匹配。
更新 2
答案中提到了另一种有效的方法。下面提到了对此的完整查询。因此,LIKE 运算符最终只扫描由全文搜索查询选择的那些行。
WITH x AS
(SELECT MessageID,
Message
FROM Messages m
WHERE CONTAINS (m.Message,
N'2x-4=0') )
SELECT MessageID,
Message
FROM x
WHERE x.Message LIKE "%2x-4=0%"
【问题讨论】:
标签: sql sql-server sql-server-2012 full-text-search latex