SQL选择任意顺序的关键字

时间:2011-01-21 20:56:45

标签: sql sql-server sql-server-2005

我正在为购物车网站构建搜索功能,该网站查询SQL Server数据库。当用户在搜索框中输入“Hula Hoops”时,我想要以任何顺序包含“Hula”和“Hoop”的所有记录的结果。此外,我需要搜索多个列(即ProductName,Description,ShortName,MaufacturerName等)

在搜索“Hula hoop”时,应返回所有这些产品名称:

  • 呼啦圈
  • Hoop Hula
  • xxhula的hoopity坚持

(如果可以按相关性排序,可以获得奖励积分!)

3 个答案:

答案 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#问题。你必须做这样的事情(假设你自己构建SqlCommandDbCommand对象;如果你正在使用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运算符并将其传递给您的搜索输入。

您可以开始HEREHERE了解更多信息

答案 2 :(得分:0)

您可能也想查看SOLR - 如果您要进行此类搜索。超酷。

http://lucene.apache.org/solr/