2009-02-03 63 views
11

將用戶輸入的搜索詞轉換爲可用於全文搜索的where子句的查詢的最佳方式是什麼?查詢表並獲取相關結果?將用戶輸入的搜索查詢轉換爲where子句以用於SQL Server全文搜索

+"e-mail" +attachment -"word document" -"e-learning" 

應轉化爲類似:

SELECT * FROM MyTable WHERE (CONTAINS(*, '"e-mail"')) AND (CONTAINS(*, '"attachment"')) AND (NOT CONTAINS(*, '"word document"')) AND (NOT CONTAINS(*, '"e-learning"')) 

我使用的是query parser class的那一刻,它分析用戶進入令牌查詢例如,下面的查詢用戶輸入使用正則表達式,然後從標記構造where子句。

但是,鑑於這可能是許多使用全文搜索的系統的常見要求,我很好奇其他開發人員是如何解決這個問題的,以及是否有更好的方法來處理這些問題。

回答

0

我意識到這是從你原來的問題的一個側面,但你有沒有考慮過從SQL全文索引和使用像Lucene/Solr而不是?

+0

是的,我想在某個時候轉移到Lucene,儘管過去我已經觸及了它,雖然設置基本操作相對簡單,但要使其與我現在做的相同是多一點工作,所以我擱置了這一點。 – Mun 2009-02-03 11:52:09

0

要做到這一點,最簡單的方法是使用動態SQL(我知道,在這裏插入的安全問題),並打破短語到正確格式的字符串。

您可以使用函數將短語分解爲可用於創建新字符串的表變量。

7

如何實現使用的.Net/C#/實體框架接受的答案...

  1. 使用的NuGet安裝反諷。

  2. 從添加樣品等級: http://irony.codeplex.com/SourceControl/latest#Irony.Samples/FullTextSearchQueryConverter/SearchGrammar.cs

  3. 這樣寫代碼到用戶輸入的字符串轉換爲查詢。

    var grammar = new Irony.Samples.FullTextSearch.SearchGrammar(); 
    var parser = new Irony.Parsing.Parser(grammar); 
    var parseTree = parser.Parse(userEnteredSearchString); 
    string query = Irony.Samples.FullTextSearch.SearchGrammar.ConvertQuery(parseTree.Root); 
    
  4. 也許寫一個存儲過程是這樣的:

    create procedure [dbo].[SearchLivingFish] 
    
    @Query nvarchar(2000) 
    
    as 
    
    select * 
    from Fish 
    inner join containstable(Fish, *, @Query, 100) as ft 
    on ft.[Key] = FishId 
    where IsLiving = 1 
    order by rank desc 
    
  5. 運行查詢。

    var fishes = db.SearchLivingFish(query); 
    
1

除了上面你@ franzo的答案可能還需要更改SQL默認停止字的行爲。否則包含單個數字(或其他停用詞)的查詢將不會返回任何結果。

或者禁用停止的話,創建自己的停用詞列表和/或設置干擾詞作爲SQL 2008: Turn off Stop Words for Full Text Search Query

解釋要查看的(英文)SQL停用詞系統列表進行改造,運行:

select * from sys.fulltext_system_stopwords where language_id = 1033