SQL以任意顺序选择相似的关键字

SQL以任意顺序选择相似的关键字,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在为一个购物车站点构建一个搜索功能,该站点查询SQL Server数据库。当用户在搜索框中输入“呼啦圈”时,我希望所有包含“呼啦圈”和“呼啦圈”的记录都能以任意顺序显示结果。此外,我需要搜索多个列(即ProductName、Description、ShortName、MaufacturerName等) 搜索“呼拉圈”时,应返回所有这些产品名称: 呼拉圈 呼啦圈 呼啦圈的环向性 (如果可以按相关性排序,则可以获得额外的积分!)SQL Server全文搜索应该可以帮助您解决问题。基本上,您将

我正在为一个购物车站点构建一个搜索功能,该站点查询SQL Server数据库。当用户在搜索框中输入“呼啦圈”时,我希望所有包含“呼啦圈”和“呼啦圈”的记录都能以任意顺序显示结果。此外,我需要搜索多个列(即ProductName、Description、ShortName、MaufacturerName等)

搜索“呼拉圈”时,应返回所有这些产品名称:

  • 呼拉圈
  • 呼啦圈
  • 呼啦圈的环向性

(如果可以按相关性排序,则可以获得额外的积分!)

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