1

你能帮我吗,请弄清楚为什么 t-sql 表达式如下:

  DECLARE @SearchWord varchar(max)
SET @SearchWord = '"I went to primary school in London "'
SELECT * FROM sys.dm_fts_parser('FormsOf(INFLECTIONAL, '+ @SearchWord + ')', 1033, 0, 0) 
where display_term in 
( SELECT display_term FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "go to school")', 1033, null, 0) )

返回

在此处输入图像描述

尽管

DECLARE @SearchWord varchar(max)
SET @SearchWord = '"I went. to primary school in London "'
SELECT * FROM sys.dm_fts_parser('FormsOf(INFLECTIONAL, '+ @SearchWord + ')', 1033, 0, 0) 
where display_term in 
( SELECT display_term FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "go to school")', 1033, null, 0) )

返回

在此处输入图像描述

即,当在搜索字符串的某处添加一个点时,相应的事件会移动 8 个位置?dot 或者我的 t-sql 表达式有什么问题吗?提前致谢!

4

2 回答 2

2

首先,文档说这occurrence表明order,而不是position。这意味着这些值可以是相对的,而不是绝对的,但仍能正确显示顺序。

接下来,通过观察,数字的第一位表示从零开始的句子编号(第一个句子除外,其中没有前导零)。“点”实际上是一个句号,它以英语结束一个句子,所以它有一些重要意义也就不足为奇了。查看此查询的输出,您将看到“句末”特殊术语:

DECLARE @SearchWord varchar(max) = N'"I went. to primary school in London. it was a nice school. to go there was fun"'
SELECT * 
FROM sys.dm_fts_parser('FormsOf(INFLECTIONAL, '+ @SearchWord + ')', 1033, 0, 0)

然后,如果您用较长的句子查看查询...

DECLARE @SearchWord varchar(max) = N'"I went. to primary school in London. it was a nice school. to go there was fun"'
SELECT * 
FROM sys.dm_fts_parser('FormsOf(INFLECTIONAL, '+ @SearchWord + ')', 1033, 0, 0)
where display_term in 
(SELECT display_term FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "go to school")', 1033, null, 0))

...您可以看到,对于句子 1 和 2,theoccurrence确实也是单词位置,但对于句子 3 和 4,则不是。我不知道为什么会发生这种情况,并且文档中没有任何内容可以解释它,但是由于文档没有说这occurrence与职位相同,因此并不完全令人惊讶。

这些问题也可能很有趣:

于 2013-02-11T20:19:53.330 回答
0

正如@Pondlife 建议使用 PATINDEX() 来查找位置(不是出现),我能够用dm_fts_parser. 下面的 t-sql 返回特定文本中所有匹配形式(INFLECTIONAL)的确切位置和长度,无论是否@SearchWord包含点:

DECLARE @SearchWord nvarchar(max)

SET @SearchWord = N'"I went. to primary school in London "'

SELECT distinct y.pos,y.lgth from 
(
SELECT w.*,
PATINDEX(N'%[^a-z]' + w.Display_Term + N'[^a-z]%',@SearchWord) as pos, LEN(w.display_term) as lgth
 FROM sys.dm_fts_parser(N'FormsOf(INFLECTIONAL, '+ @SearchWord + ')', 1033, 0, 0) w 
where display_term in 
( SELECT display_term FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "go to school")', 1033, 0, 0) ) and 
PATINDEX(N'%[^a-z]' + w.Display_Term + N'[^a-z]%',
@SearchWord)<>0
) y

它返回下面的结果集:

在此处输入图像描述

于 2013-03-11T10:21:58.833 回答