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

asp.net c# allowing users to search string using multiple terms

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

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

但是,如果有人搜索 "red car" 而标题是 "the car that is red",我该如何计算?我知道我可以在 SPACE 上拆分,然后搜索每个术语,但这似乎过于复杂,我还需要去掉非单词字符。

我一直在考虑使用正则表达式,但不确定它是否会按顺序或任何顺序搜索项目。

我想我基本上是想在我的应用程序中创建一个简单的 google 搜索。

我想你正在寻找这样的东西:

    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();

您是否考虑过使用合适的搜索引擎,例如 Lucene? Lucene 中的 StandardAnalyzer 使用 StandardTokenizer,它在标记化时处理(某些)特殊字符。例如,它将 "red-car" 拆分为标记 "red car",从而 "removing" 特殊字符。

为了在 Lucene 索引中搜索多个字段,您可以使用 MultiFieldQueryParser。

您可以为此使用 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