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有關代碼的更多信息和討論,請參閱我的文章簡單的全文搜索查詢。