2011-11-07 63 views
0

我有一个表[用户]与FName,LName和城市3列。我想实现一个搜索算法,该算法由3个列产生,顶部为AND,结果为ORed。使用sql和asp.net的高级搜索查询

对于如:

  1. 拉朱拉姆班加罗尔
  2. 拉姆拉朱海德拉巴
  3. 克里希纳拉朱奈

当我搜索拉朱奈应该导致所有的记录与第3条记录顶部,因为它是完全匹配和其他2可以遵循。我怎样才能做到这一点?请指教。

回答

1

您将需要查找搜索加权算法。没有人可以为你写你的算法,这是你决定什么需要更多的权重。

像这样的高级搜索并不简单。有很多因素(列出太多),取决于您想要在搜索中投入多少努力。

一个好的开始将是使用您正在使用的任何.NET语言来分割搜索查询中的每个单词。也许你会想要比下一个和下一个更重要的第一个单词,依此类推?

然后决定哪一个对搜索更重要。或许LNameCity更重要?如果是这样,当在任一搜索词中找到匹配项时,可以将该列的权重与搜索查询中该词的位置权重相乘。

那么对于找到的多个列,您可以将它们添加在一起?乘以它们?也许在乘以之前将LName重量平方?任何你认为会使体重更加准确(只要保持表现)。

你可以做任何你想要加权的每一行,但是当算法完成时,你可以简单地使用ORDER BY Weight来把最有可能的行放在最上面,然后“嗨!

+0

嘿谢谢你的好主意。会试试看。 –

0

有一点烦琐,但作为一个起点,动态地为OR创建WHERE子句,然后UNION将结果与精确匹配。还包括排序栏,例如

SELECT FName, LName, City, 1 AS SortOrder 
FROM Users 
WHERE 
    FName = 'Raju' OR 
    FName = 'Chennai' -- Add the rest of the OR clauses 
UNION 
SELECT FName, LName, City, 0 AS SortOrder 
WHERE FName + ' ' + LName + ' ' + City LIKE '%Raju Chennai%' 
ORDER BY SortOrder 
0

我相信,你可以利用复杂的算法进行全文搜索。一些DBMS(如MSSQL)有自己的实现,但您可以使用免费和开源的Lucene。