我正在尝试为我的应用程序添加一个搜索功能,该功能将允许某人输入几个单词并搜索我的数据中的单词。做单个单词和短语很简单:
if (x.Title.ToUpper().Contains(tbSearch.Text.ToUpper()) || x.Description.ToUpper().Contains(tbSearch.Text.ToUpper()))
但是,如果有人输入了"红色汽车"的搜索,标题是"红色的汽车",我该怎么计算呢?我知道我可以在SPACE上拆分,然后搜索每个单词,但这似乎太复杂了,我还需要去掉非单词字符。
我一直在考虑使用RegExes,但不确定它是否会按顺序或任何顺序搜索物品。
我想我基本上是想在我的应用程序中创建一个简单的谷歌搜索。
您是否考虑过使用Lucene等合适的搜索引擎?Lucene中的StandardAnalyzer使用StandardTokenizer,它在标记化时处理(一些)特殊字符。例如,它会将"红色汽车"拆分为令牌"红色车辆",从而"删除"特殊字符。
为了在Lucene索引中搜索多个字段,可以使用MultiFieldQueryParser。
我想你正在寻找这样的东西:
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();
您可以使用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