我有一个表[用户]与FName,LName和城市3列。我想实现一个搜索算法,该算法由3个列产生,顶部为AND,结果为ORed。使用sql和asp.net的高级搜索查询
对于如:
- 拉朱拉姆班加罗尔
- 拉姆拉朱海德拉巴
- 克里希纳拉朱奈
当我搜索拉朱奈应该导致所有的记录与第3条记录顶部,因为它是完全匹配和其他2可以遵循。我怎样才能做到这一点?请指教。
我有一个表[用户]与FName,LName和城市3列。我想实现一个搜索算法,该算法由3个列产生,顶部为AND,结果为ORed。使用sql和asp.net的高级搜索查询
对于如:
当我搜索拉朱奈应该导致所有的记录与第3条记录顶部,因为它是完全匹配和其他2可以遵循。我怎样才能做到这一点?请指教。
您将需要查找搜索加权算法。没有人可以为你写你的算法,这是你决定什么需要更多的权重。
像这样的高级搜索并不简单。有很多因素(列出太多),取决于您想要在搜索中投入多少努力。
一个好的开始将是使用您正在使用的任何.NET语言来分割搜索查询中的每个单词。也许你会想要比下一个和下一个更重要的第一个单词,依此类推?
然后决定哪一个对搜索更重要。或许LName
比City
更重要?如果是这样,当在任一搜索词中找到匹配项时,可以将该列的权重与搜索查询中该词的位置权重相乘。
那么对于找到的多个列,您可以将它们添加在一起?乘以它们?也许在乘以之前将LName
重量平方?任何你认为会使体重更加准确(只要保持表现)。
你可以做任何你想要加权的每一行,但是当算法完成时,你可以简单地使用ORDER BY Weight
来把最有可能的行放在最上面,然后“嗨!
有一点烦琐,但作为一个起点,动态地为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
我相信,你可以利用复杂的算法进行全文搜索。一些DBMS(如MSSQL)有自己的实现,但您可以使用免费和开源的Lucene。
嘿谢谢你的好主意。会试试看。 –