sys.dm_fts_parser (Transact-SQL)

返回将给定断字符同义词库非索引字表组合应用于查询字符串输入后生成的最终词语切分结果。此词语切分结果等效于全文引擎针对指定查询字符串的输出。

sys.dm_fts_parser 是动态管理函数。

语法

sys.dm_fts_parser('query_string', lcid, stoplist_id, accent_sensitivity)

参数

  • query_string
    要分析的查询。query_string 可以是 CONTAINS 语法支持的字符串链。例如,您可以包括变形、同义词库和逻辑运算符。

  • lcid
    用于分析 query_string 的断字符的区域设置标识符 (LCID)。

  • stoplist_id
    lcid 标识的断字符所使用的非索引字表的 ID(如果有)。stoplist_id 的数据类型为 int。如果指定“NULL”,则不使用非索引字表。如果指定 0,则使用系统 STOPLIST。

    非索引字表 ID 在数据库中是唯一的。若要获取给定表的全文索引的非索引字表 ID,请使用 sys.fulltext_indexes 目录视图。

  • accent_sensitivity
    控制全文搜索是否区分变音符的布尔值。accent_sensitivity 的数据类型为 bit,可以是以下值之一:

    重音区分设置为…

    0

    不区分

    诸如“café”和“cafe”之类的字的处理方式是完全相同的。

    1

    区分

    诸如“café”和“cafe”之类的字的处理方式是不同的。

    注意注意

    若要查看全文目录中该值的当前设置,请运行以下 Transact-SQL 语句:SELECT fulltextcatalogproperty('catalog_name', 'AccentSensitivity');。

返回的表

列名

数据类型

说明

keyword

varbinary(128)

断字符返回的给定关键字的十六进制表示形式。该表示形式用于存储全文索引的关键字。用户无法读取该值,但是在将给定关键字与返回全文索引内容(如 sys.dm_fts_index_keywordssys.dm_fts_index_keywords_by_document)的其他动态管理视图所返回的输出相关联时,该值十分有用。

注意注意
OxFF 表示指示文件或数据集末尾的特殊字符。

group_id

int

包含一个整数值,用于区分从中生成给定字词的逻辑组。例如,'Server AND DB OR FORMSOF(THESAURUS, DB)"' 生成以下英语 group_id 值:

group_iddisplay_term
1Server
2DB
3DB

phrase_id

int

包含一个整数值,用于区别断字符给出复合词(如 full-text)替代形式的情况。有时,如果存在复合词(“multi-millon”),断字符将给出替代形式。这些替代形式(短语)有时需要加以区别。

例如,'multi-million' 生成以下英语 phrase_id 值:

phrase_iddisplay_term
1 multi
1 million
2 multimillion

occurrence

int

指示分析结果中每个字词的顺序。例如,对于短语“SQL Server query processor”,occurrence 会包含该英语短语中字词的以下 occurrence 值:

occurrencedisplay_term
1 SQL
2 Server
3 query
4 processor

special_term

nvarchar(8000)

包含有关断字符给出的字词特征的信息,可以是以下值之一:

Exact match

Noise word

End of Sentence

End of paragraph

End of Chapter

display_term

nvarchar(8000)

包含关键字的可读形式。与旨在访问全文索引内容的函数一样,由于非规范化限制,此显示字词可能与原始字词并不完全相同。不过,该字词应该具有足够高的准确性,可帮助您从原始输入中识别它。

expansion_type

int

包含有关给定字词的扩展特性的信息,可以是以下值之一:

0 = 单个词的情况

2 = 变形扩展

4 = 同义词库扩展/替换

例如,请考虑同义词库将 run 定义为 jog 扩展的情况:

<expansion>

<sub>run</sub>

<sub>jog</sub>

</expansion>

字词 FORMSOF (FREETEXT, run) 生成以下输出:

run,其中 expansion_type=0

runs,其中 expansion_type=2

running,其中 expansion_type=2

ran,其中 expansion_type=2

jog,其中 expansion_type=4

source_term

nvarchar(8000)

从中生成或分析给定字词的字词或短语。例如,对 '"word breakers" AND stemmers' 的查询生成以下英语 source_term 值:

source_termdisplay_term
word breakersword
word breakersbreakers
stemmersstemmers

注释

sys.dm_fts_parser 支持全文谓词(如 CONTAINSFREETEXT)和函数(如 CONTAINSTABLEFREETEXTTABLE)的语法和功能。

使用 Unicode 分析特殊字符

当分析查询字符串时,sys.dm_fts_parser 使用您连接的数据库的排序规则,除非指定 Unicode 格式的查询字符串。因此,对于包含特殊字符的非 Unicode 字符串,例如 ü 或 ç,可能会得到意外的输出,具体情况视数据库的排序规则而定。若要独立于数据库排序规则处理查询字符串,请为该字符串添加前缀 N,即,N'query_string'。

有关详细信息,请参阅本主题后面的“C.显示包含特殊字符的字符串的输出”。

何时使用 sys.dm_fts_parser

sys.dm_fts_parser 可能对调试非常有用。一些主要的应用场景包括:

  • 了解给定断字符如何处理给定输入

    当查询返回意外结果时,问题可能出在断字符分析和断开数据的方式。通过使用 sys.dm_fts_parser,您可以找到断字符传递给全文索引的结果。此外,还可以查看哪些字词是在全文索引中不搜索的非索引字。某个字词是否为给定语言的非索引字取决于,它是否在函数中声明的 stoplist_id 值所指定的非索引字表中。

    还要注意重音区分标志,用户可通过该标志了解断字符是如何根据重音区分信息分析输入的。

  • 了解词干分析器如何处理给定输入

    通过指定包含以下 FORMSOF 子句的 CONTAINS 或 CONTAINSTABLE 查询,您可以了解断字符和词干分析器如何分析查询字词及其词干形式:

    FORMSOF( INFLECTIONAL, query_term )
    

    可以从结果中看出,将哪些字词传递给了全文索引。

  • 了解同义词库如何扩展或替换全部或部分输入

    您还可以指定:

    FORMSOF( THESAURUS, query_term )
    

    此查询的结果显示,断字符和同义词库如何针对查询字词进行交互。您可以看到来自同义词库的扩展或替换,并确定实际针对全文索引发出的结果查询。

    请注意,如果用户发出:

    FORMSOF( FREETEXT, query_term )
    

    将自动执行变形和同义词库功能。

除了上述应用场景外,sys.dm_fts_parser 还在很大程度上帮助您了解和解决很多其他的全文查询问题。

权限

要求具有 sysadmin 固定服务器角色的成员身份以及指定非索引字表的访问权限。

示例

A. 显示对某个关键字或短语使用给定断字符的输出

下面的示例返回对以下查询字符串使用英语断字符(LCID 为 1033)且不使用非索引字表的输出:

The Microsoft business analysis

禁用了重音区分。

SELECT * FROM sys.dm_fts_parser (' "The Microsoft business analysis" ', 1033, 0, 0)

B. 显示给定断字符在非索引字表筛选上下文中的输出

下面的示例返回对以下查询字符串使用英语断字符(LCID 为 1033)和英语非索引字表(ID 为 77)的输出:

"The Microsoft business analysis" OR "MS revenue"

禁用了重音区分。

SELECT * FROM sys.dm_fts_parser (' "The Microsoft business analysis"  OR " MS revenue" ', 1033, 77, 0)

C. 显示包含特殊字符的字符串的输出

下面的示例使用 Unicode 来分析以下法语字符串:

français

示例指定了法语的 LCID 1036,以及用户定义的非索引字表的 ID 5。启用了重音区分。

SELECT * FROM sys.dm_fts_parser(N'français', 1036, 5, 1);