这更像是一个语法问题。你如何通过一个输入框来判断用户的意图?
- 他们在寻找“John Hamburg”这个人吗?
- 他们在寻找“约翰汉堡街”吗?
- 他们在寻找住在斯普林菲尔德“汉堡街”的“约翰”吗?
- 他们在寻找住在“汉堡”市的“约翰”吗?
在不知道用户意图的情况下,你能期望的最好结果就是对条款进行 OR,并获得最高排名的点击。
否则,您需要编写大量逻辑,具体取决于传入的字数:
2 个字:
搜索术语 1 的员工数据,搜索术语 2 的员工数据,搜索术语 1 的地址数据,搜索术语 2 的地址数据。按术语合并结果,按点击次数最多排序。
三个字:
搜索术语 1 的员工数据,搜索术语 2 的员工数据,搜索术语 3 的员工数据,搜索术语 1 的地址数据,搜索术语 2 的地址数据,搜索术语 3 的地址数据。按术语合并结果,按点击次数排序。
等等……
我想我会重新设计 GUI,至少将输入分成名称和地址。如果这不可能,请强制执行语法规则,“在出现逗号之前,第一个单词将被视为名称,之后的任何单词都将被视为地址”
编辑:
您最好的选择仍然是 OR 条款,并获得最高排名的命中。这是一个示例,以及一个示例为什么如果不对输入进行一些预处理以判断用户的意图,这是不理想的:
insert into Employee (id, [name]) values (1, 'John Hamburg')
insert into Employee (id, [name]) values (2, 'John Smith')
insert into Employee (id, [name]) values (3, 'Bob Hamburg')
insert into Employee (id, [name]) values (4, 'Bob Smith')
insert into Employee (id, [name]) values (5, 'John Doe')
insert into Address (id, street, city, employeeid) values (1, 'Main St.', 'Springville', 1)
insert into Address (id, street, city, employeeid) values (2, 'Hamburg St.', 'Springville', 2)
insert into Address (id, street, city, employeeid) values (3, 'St. John Ave.', 'Springville', 3)
insert into Address (id, street, city, employeeid) values (4, '5th Ave.', 'Hamburg', 4)
insert into Address (id, street, city, employeeid) values (5, 'Oak Lane', 'Hamburg', 5)
现在,由于我们不知道哪些关键字将应用于哪个表,因此我们必须假设它们可以应用于任何一个表,因此我们必须对每个表进行 OR 运算,将结果合并,聚合它们,然后计算最高等级。
SELECT Id, [Name], Street, City, SUM([Rank])
FROM
(
SELECT emp.Id, [Name], Street, City, [Rank]
FROM Employee emp
JOIN [Address] addr ON emp.Id = addr.EmployeeId
JOIN CONTAINSTABLE(Employee, *, 'JOHN OR Hamburg') AS keyTblEmp ON emp.Id = keyTblEmp.[KEY]
UNION ALL
SELECT emp.Id, [Name], Street, City, [Rank]
FROM Employee emp
JOIN [Address] addr ON emp.Id = addr.EmployeeId
JOIN CONTAINSTABLE([Address], *, 'JOHN OR Hamburg') AS keyTblAdd ON addr.Id = keyTblAdd.[KEY]
) as tmp
GROUP BY Id, [Name], Street, City
ORDER BY SUM([Rank]) DESC
这不太理想,这就是你得到的例子(在你的例子中,你会希望来自汉堡的 John Doe 首先出现):
Id Name Street City Rank
2 John Smith Hamburg St. Springville 112
3 Bob Hamburg St. John Ave. Springville 112
5 John Doe Oak Lane Hamburg 96
1 John Hamburg Main St. Springville 48
4 Bob Smith 5th Ave. Hamburg 48
但在将输入提交给 SQL 以对用户想要的内容做出“最佳猜测”之前,您可以在不解析输入的情况下做到这一点。