asp.net c#允许用户使用多个术语搜索字符串



我正在尝试为我的应用程序添加一个搜索功能,该功能将允许某人输入几个单词并搜索我的数据中的单词。做单个单词和短语很简单:

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

最新更新