我正在为购物车网站构建搜索功能,该网站查询SQL Server数据库。当用户在搜索框中输入“Hula Hoops”时,我想要以任何顺序包含“Hula”和“Hoop”的所有记录的结果。此外,我需要搜索多个列(即ProductName,Description,ShortName,MaufacturerName等)
在搜索“Hula hoop”时,应返回所有这些产品名称:
(如果可以按相关性排序,可以获得奖励积分!)
答案 0 :(得分:3)
听起来你真的正在寻找全文搜索,特别是因为你想要加权这些词。
为了使用LIKE
,您必须使用多个表达式(每个单词,每列一个),这意味着动态SQL。我不知道你使用的是哪种语言,所以我不能提供一个例子,但你必须提出一个这样的语句:
对于“Hula Hoops”:
where (ProductName like '%hula%' or ProductName like '%hoops%')
and (Description like '%hula%' or Description like '%hoops%')
and (ShortName like '%hula%' or ShortName like '%hoops%')
等
不幸的是,这确实是唯一的方法。使用全文搜索可以将标准降低到每列一个,但您仍然必须明确指定列。
由于你使用的是SQL Server,我猜想这是一个C#问题。你必须做这样的事情(假设你自己构建SqlCommand
或DbCommand
对象;如果你正在使用ORM,所有的赌注都会被取消,你可能不会问无论如何):
SqlCommand command = new SqlCommand();
int paramCount = 0;
string searchTerms = "Hula Hoops";
string commandPrefix = @"select *
from Products";
StringBuilder whereBuilder = new StringBuilder();
foreach(string term in searchTerms.Split(' '))
{
if(whereBuilder.Length == 0)
{
whereBuilder.Append(" where ");
}
else
{
whereBuilder.Append(" and ");
}
paramCount++;
SqlParameter param = new SqlParameter(string.Format("param{0}",paramCount), "%" + term + "%");
command.Parameters.Add(param);
whereBuilder.AppendFormat("(ProductName like @param{0} or Description like @param{0} or ShortName like @param{0})",paramCount);
}
command.CommandText = commandPrefix + whereBuilder.ToString();
答案 1 :(得分:2)
SQL Server全文搜索应该可以帮助您。您基本上将在要搜索的列上创建索引。在查询的where子句中,您将使用CONTAINS运算符并将其传递给您的搜索输入。
答案 2 :(得分:0)
您可能也想查看SOLR - 如果您要进行此类搜索。超酷。