2015-03-31 48 views
0

我試圖添加一個搜索功能到我的應用程序,它將允許某人輸入幾個詞並在我的數據中搜索這些詞。 做單一的單詞和短語很簡單:asp.net c#允許用戶使用多個詞搜索字符串

if (x.Title.ToUpper().Contains(tbSearch.Text.ToUpper()) || x.Description.ToUpper().Contains(tbSearch.Text.ToUpper())) 

,但我怎麼工作了,如果有人輸入了「紅車」稱號是「車是紅色的」搜索?我知道我可以在SPACE上分割,然後搜索每個術語,但這看起來過於複雜,我還需要去掉非單詞字符。

我一直在尋找使用RegExes,但不知道它是否會按順序或任何順序搜索項目。

我想我試圖在我的應用程序中基本上創建一個簡單的谷歌搜索。

+1

您應該使用全文搜索引擎,而不是使用.NET這一點。這是一個解決的難題,您將重新發明方形輪。 – Aron 2015-03-31 10:43:38

回答

1

你有沒有考慮使用適當的搜索引擎,如Lucene的?標記化時,Lucene中的StandardAnalyzer使用StandardTokenizer,它處理(某些)特殊字符。例如,它會將「紅車」分成「紅車」標記,從而「移除」特殊字符。

爲了在Lucene索引中的多個字段中搜索,可以使用MultiFieldQueryParser。

0

我認爲你正在尋找的東西是這樣的:

public static bool HasWordsContaining(this string searchCriteria, string toFilter) 
    { 
     var regex = new Regex(string.Format("^{0}| {0}", Regex.Escape(toFilter)), RegexOptions.IgnoreCase); 
     return regex.IsMatch(searchCriteria); 
    } 

用法:

someList.Where(x=>x.Name.HasWordsContaining(searchedText)).ToList(); 
0

您可以使用CONTAINSTABLE來做到這一點。您可以使用SPROC並傳入搜索字符串。

USE AdventureWorks2012 
GO 

SELECT 
    KEY_TBL.RANK, 
    FT_TBL.Description 
FROM 
    Production.ProductDescription AS FT_TBL 
INNER JOIN 
FREETEXTTABLE 
    (
    Production.ProductDescription, 
    Description, 
    'perfect all-around bike' 
    ) AS KEY_TBL 
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY] 
ORDER BY KEY_TBL.RANK DESC 
GO 

https://msdn.microsoft.com/en-us/library/ms142583.aspx