В настоящее время я работаю над проектом, в котором я хочу искать сотрудников с помощью всего одного входного поискового запроса. Для этого я использую SQL FTS.
Схема таблицы выглядит следующим образом
Таблица сотрудников
EmployeeId, Имя, Фамилия
Пример данных
1, Джон, Миллер
2, Чак, Норрис
Таблица адресов
AddressId, EmployeeId, CityId, Street, StreetNumber
Пример данных
1, 1, 1, проспект, 12
2, 2, 2, Wimbledon Rd, 12
Городской стол
CityId, Имя, ZipCode
Пример данных
1, Гамбург, 22335
2, Лондон, 12345
Так что теперь я получил следующий поисковый запрос:
- Джон Гамбург: Означает Джона И Гамбурга и должен вернуть 1 запись.
- Джон Лондон: означает Джон И Лондон и должен вернуть 0 записей, поскольку в Лондоне нет Джона.
- Норрис Уимблдон: означает Норрис И Уимблдон и должен вернуть 1 запись.
Теперь проблема в том, что использование CONTAINSTABLE позволяет искать только одну таблицу за раз. Таким образом, применение «John AND Hamburg» к полному текстовому каталогу сотрудников возвращает 0 записей, поскольку «Hamburg» находится в таблице адресов.
Так что в настоящее время я могу использовать «ИЛИ» вместо «И», например:
SELECT
(keyTblSp.RANK * 3) AS [Rank],
sp.*
FROM Employee sp
INNER JOIN
CONTAINSTABLE(Employee, *, 'John OR Hamburg', 1000) AS keyTblSp
ON sp.EmployeeId = keyTblSp.[KEY]
UNION ALL
SELECT
(keyTbl.RANK * 2) AS [Rank],
sp.*
FROM Employee sp
LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId
INNER JOIN
CONTAINSTABLE([Address], *, 'John OR Hamburg', 1000) AS keyTbl
ON addr.AddressId = keyTbl.[KEY]
UNION ALL
SELECT
(keyTbl.RANK * 2) AS [Rank],
sp.*
FROM Employee sp
LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId
LEFT OUTER JOIN [City] cty ON cty.CityId = addr.CityId
INNER JOIN
CONTAINSTABLE([City], *, 'John OR Hamburg', 1000) AS keyTbl
ON cty.CityId = keyTbl.[KEY]
Это приводит к тому, что возвращается не только Джон, который живет в Гамбурге, но каждый человек по имени Джон и каждый, кто живет в Гамбурге.
Одно из решений, которое я могу придумать, - это каким-то образом вычислить столбец в Таблице сотрудников, который содержит все необходимые значения для полнотекстового поиска, например.
Таблица сотрудников
EmployeeId, Имя, Фамилия, FulltextColumn
Пример данных
1 | Джон | Миллер | Проспект Джона Миллера, 12 Гамбург 22335
Так что тогда я мог бы сделать
SELECT
(keyTbl.RANK) AS [Rank],
sp.*
FROM Employee sp
INNER JOIN
CONTAINSTABLE([Employee], FulltextColumn, 'John AND Hamburg', 1000) AS keyTbl
ON sp.EmployeeId = keyTbl.[KEY]
Возможно ли это? Есть другие идеи?