SQL以任意顺序选择相似的关键字
我正在为一个购物车站点构建一个搜索功能,该站点查询SQL Server数据库。当用户在搜索框中输入“呼啦圈”时,我希望所有包含“呼啦圈”和“呼啦圈”的记录都能以任意顺序显示结果。此外,我需要搜索多个列(即ProductName、Description、ShortName、MaufacturerName等) 搜索“呼拉圈”时,应返回所有这些产品名称:SQL以任意顺序选择相似的关键字,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在为一个购物车站点构建一个搜索功能,该站点查询SQL Server数据库。当用户在搜索框中输入“呼啦圈”时,我希望所有包含“呼啦圈”和“呼啦圈”的记录都能以任意顺序显示结果。此外,我需要搜索多个列(即ProductName、Description、ShortName、MaufacturerName等) 搜索“呼拉圈”时,应返回所有这些产品名称: 呼拉圈 呼啦圈 呼啦圈的环向性 (如果可以按相关性排序,则可以获得额外的积分!)SQL Server全文搜索应该可以帮助您解决问题。基本上,您将
- 呼拉圈
- 呼啦圈
- 呼啦圈的环向性
(如果可以按相关性排序,则可以获得额外的积分!)SQL Server全文搜索应该可以帮助您解决问题。基本上,您将在要搜索的列上创建索引。在查询的where子句中,您将使用CONTAINS运算符并将搜索输入传递给它 您可以开始或了解更多内容听起来您真的在寻找全文搜索,特别是因为您想对单词进行加权 为了像一样使用
,您必须使用多个表达式(每个单词、每个列一个),这意味着动态SQL。我不知道您使用的是哪种语言,因此我无法提供示例,但您必须生成如下语句:
对于“呼啦圈”:
等等
不幸的是,这是唯一的办法。使用全文搜索将允许您将条件减少到每列一个,但您仍然需要显式指定列
因为您使用的是SQL Server,所以我冒昧地猜测这是一个C#问题。您必须这样做(假设您自己正在构造SqlCommand
或DbCommand
对象;如果您使用的是ORM,那么所有的赌注都没有了,您可能也不会问这个问题):
如果您要进行这种类型的搜索,您可能也希望查看SOLR。超级酷
两对产品名称之间不需要使用AND运算符吗?@Mark:是的,应该是。谢谢Dho!我知道有一个功能可以做到这一点。包含效果很好,谢谢!我用REPLACE函数修改了搜索字符串,得到了完美的结果。很高兴我能帮上忙。我刚刚开始探索全文搜索自己
where (ProductName like '%hula%' or ProductName like '%hoops%')
and (Description like '%hula%' or Description like '%hoops%')
and (ShortName like '%hula%' or ShortName like '%hoops%')
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();