2015-03-31 49 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