Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery是一个.NET类库,可将用户友好的搜索术语转换为有效的Microsoft SQL Server全文搜索查询。该代码试图检测和处理所有查询将导致SQL Server生成错误的情况。
Microsoft SQL Server提供了功能强大的全文搜索功能。但是,语法相当神秘,尤其是对于非程序员。此外,如果情况不完全正确,则有许多条件会导致SQL Server引发错误。
FullTextSearchQuery将用户友好的Google搜索词转换为相应的全文搜索SQL查询条件。它的目标是永远不要对不良形成的输入进行例外。它只是从输入中构造了它最佳的有效查询。
以下列表显示了如何转换各种输入。
| 输入 | 输出 | 描述 |
|---|---|---|
| ABC | FORMSOF(INFLECTIONAL, abc) | 查找ABC的拐点形式。 |
| 〜ABC | FORMSOF(THESAURUS, abc) | 查找ABC的词库变体。 |
| “ ABC” | "abc" | 查找确切的术语ABC。 |
| +ABC | "abc" | 查找确切的术语ABC。 |
| “ abc”接近“ def” | "abc" NEAR "def" | 查找确切的abc附近确切项def。 |
| ABC* | "abc*" | 找到以ABC开头的单词。 |
| -abc def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | 找到DEF的拐点形式,而不是ABC的拐点形式。 |
| ABC Def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | 找到ABC和DEF的拐点形式。 |
| ABC或DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | 查找ABC或DEF的拐点形式。 |
| < +abc +def> | "abc" NEAR "def" | 查找确切的abc附近确切项def。 |
| ABC和(DEF或GHI) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | 找到ABC和DEF或GHI的拐点形式。 |
即使已经生成了句法正确的查询,SQL Server仍然可以为某些查询生成错误。例如,在上表中,您可以看到-abc def的OUPUT交换两个子表达。这是因为NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def)会导致误差。 SQL Server在开始时不喜欢NOT喜欢。在此示例中,FullTextSearchQuery将交换两个子表达(在AND )的任何一侧。
构建查询后,FullTextSearchQuery将检查此和其他几个错误条件,并根据需要进行更正。下表描述了这些条件。
| 学期 | 采取的动作 |
|---|---|
| 不是术语1和term2 | 子表达互换。 |
| 不是术语1 | 表达被丢弃。 |
| 不是术语1,而不是术语2 | 如果将节点分组(括号)或是根节点,则表达式丢弃;否则,父节点可能包含另一个子表达,这将使此有效。 |
| 期限或不具体2 | 表达被丢弃。 |
| 术语1附近未学期2 | 几乎连词变为和。 |
fullTextSearchQuery将所有附近连词转换为与form tenmforms.literalss.literal的内部句子不是内部词时。
使用Transform()方法将搜索表达式转换为有效的SQL Server全文搜索条件。此方法采用用户友好的搜索查询,并将其转换为正确形成的全文搜索条件,可以将其传递给SQL Server的CONTAINS或CONTAINSTABLE功能。如果查询包含无效的术语,则代码将竭尽所能返回有效的搜索条件。如果找不到有效的术语,则此方法返回一个空字符串。
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ;在以下SQL查询示例中, @SearchTerm是对从Transform()返回的字符串的引用。
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];要注意的一件事是SQL Server对停止单词的处理。停止单词是诸如a和and和and之类的单词。这些词不包括在全文索引中。 SQL Server不会为这些单词索引,因为它们非常普遍,并且不会添加搜索质量。由于这些单词没有索引,因此SQL Server永远找不到这些单词的匹配。结果是,搜索停止单词也不会返回结果,即使该停止单词可能出现在文章中!
处理此问题的最佳方法似乎是将这些单词从SQL查询中排除。简单的全文搜索使您可以通过将停止单词添加到StopWords Collection属性中来做到这一点。除非引用,否则停止单词将不会包含在结果查询中,从而防止查询中的停止单词阻止所有结果。
在StopWords集合中添加标准的停止单词列表的最简单方法是将true FtsQuery构造函数传递给。 (要查看添加了哪些单词,您可以简单地检查StopWords集合。)您可以根据需要随时修改StopWords集合。
另外,SQL Server提供了一种选择以防止上述问题的选项。转换噪声单词选项可用于启用SQL Server即使查询包含停止单词(噪声单词),也可以返回匹配项。将此选项设置为1,以启用噪声单词转换。有关更多信息,请参见变换噪声单词服务器配置选项。
以下查询可用于从SQL Server数据库中获取系统停止单词。
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033有关代码的更多信息和讨论,请参阅我的文章简单的全文搜索查询。