【问题标题】:sys.dm_fts_parser dot issuesys.dm_fts_parser 点问题
【发布时间】:2013-01-27 00:04:37
【问题描述】:

你能帮我吗,请弄清楚为什么 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 表达式有什么问题吗? 提前致谢!

【问题讨论】:

    标签: sql-server-2008 tsql full-text-search


    【解决方案1】:

    首先,documentation 表示occurrence 表示顺序,而不是位置。这意味着这些值可以是相对的,而不是绝对的,但仍能正确显示顺序。

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

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

    这些问题也可能很有趣:

    【讨论】:

    • 我想使用此查询的结果来查找全文搜索结果中的搜索词位置,以突出显示它们。但是分析您的评论发现这不是一个好主意。或者有什么办法可以欺骗函数使其返回位置,而不是命令?至少,我可以列出所有出现不等于位置的字符(如“。”)吗?
    • 根据 MSDN 和 Google FTS 不提供任何获取匹配位置的方法。没有关于 FTS 内部行为的真实文档,因此做出太多假设是有风险的。我链接到的问题建议使用dm_fts_parser 来获取匹配项,然后再次搜索字符串(使用PATINDEX() 或其他)以找到它们的位置。或者,如果您非常需要此功能,您可以寻找does provide position 的替代 FTS 解决方案; Lucene 经常被提及。
    【解决方案2】:

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

    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
    

    它返回下面的结果集:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多