Использование полнотекстового поиска в SQL Server 2005 по нескольким таблицам, столбцам

У меня проблема, я создал полнотекстовый поисковый запрос, который возвращает запись (записи), в которой предоставленные мной параметры соответствуют каждому из полей (с полнотекстовым индексированием) нескольких таблиц. Проблема в том, что когда user.id равен ceritification.AId, он возвращает записи, хотя он не был удовлетворен предоставленным параметром.

Для этого примера я предоставил значение "xandrick", которое возвращает Id=184, но проблема в том, что он возвращает два идентификатора, которые равны 184 и 154. Что является лучшим способом вернуть идентификатор (идентификаторы), которые удовлетворяют предоставленному данному значению?

User table
Id  Firstname       Lastname Middlename       Email                      AlternativeEmail
154 Gregorio    Honasan Pimentel      honasangregorio@yahoo.com      honasangrego@gmail.com 
156 Qwerty  Qazggf  fgfgf     renrendo2005@yahoo.com.        orendo@gmail.com
184 Xandrick    Flores  NULL      x.flores@gmail.com              null

Сертификационная таблица

Id  AID  Certification                 School
12  184  sdssd                         AMA
13   43  web-based and framework 2     Asian development foundation college
16  184  hjhjhj                        STI
17  184  rrrer                         PUP
18  154  vbvbv                         AMA  

SELECT DISTINCT Users.Id
FROM Users
INNER JOIN Certification on Users.Id=Certification.aid
LEFT JOIN
FREETEXTTABLE (Users,(Firstname,Middlename,Lastname,Email,AlternativeEmail), 'xandrick' )as ftUsr ON Users.Id=ftUsr.[KEY] 
LEFT JOIN
FREETEXTTABLE (Certification,(Certification,School), 'xandrick' )as ftCert ON Certification.Id=ftCert.[KEY] 

3 ответа

Решение
SELECT u.Id
FROM Users u
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT c.AId
FROM Certification c
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT ad.AId
FROM ApplicantDetails ad
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT eb.AId
FROM EducationalBackground eb
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT ed.AId
FROM EmploymentDetails ed
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT e.AId
FROM Expertise e
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT ge.AId
FROM GeographicalExperience ge
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT pd.AId
FROM ProjectDetails pd
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT r.AId
FROM [References] r
WHERE FREETEXT(*,'"BPI"')
UNION
SELECT t.AId
FROM Training t
WHERE FREETEXT(*,'"BPI"')

Безусловно, лучший способ сделать это - использовать индексированное представление, объединяющее рассматриваемые таблицы. Добавьте свой свободный текстовый индекс в представление, а затем используйте его для поиска.

Хотите верьте, хотите нет, но это НАМНОГО быстрее, чем запуск нескольких предложений freetexttable.

Another solution but this is very slow compare the below query.

select DISTINCT u.Id  from Users u
 inner join Certification c   on u.ID =
 c.AId inner join ApplicantDetails ad  
 on u.ID=ad.AId inner join 
 EducationalBackground eb   on
 u.ID=eb.AId inner join
 EmploymentDetails ed   on u.Id=ed.AId
 inner join Expertise e   on u.Id=e.AId
 inner join GeographicalExperience ge  
 on u.Id=ge.AId inner join [Language] l
 on u.Id=l.AId inner join
 ProjectDetails pd   on u.Id=pd.AId
 inner join [References] r   on
 u.Id=r.AId inner join Training t  on
 u.Id=t.AId left join FreeTexttable
 (Users,
 (AlternativeEmail,Email,Firstname,Lastname,Middlename),
 'xandrick' ) as uf   on uf.[KEY] =
 u.id left join FreeTexttable
 (ApplicantDetails,
 (Address1,Address2,City,Province,StateorRegion),
 'xandrick' ) as adf   on adf.[KEY] =
 ad.id left join FreeTexttable
 (Certification,
 (Certification,School), 'xandrick' )
 as cf   on cf.[KEY] = c.id left join
 FreeTexttable (EducationalBackground,
 (fieldofStudy,other,School),
 'xandrick' ) as ebf   on ebf.[KEY] =
 eb.id left join FreeTexttable
 (EmploymentDetails,
 (Address1,Address2,City,CompanyName,DescriptionofDuties,Position,Province,TypeofBusiness),
 'xandrick' ) as edf   on edf.[KEY] =
 ed.id left join FreeTexttable
 (Expertise, (Expertise), 'xandrick' )
 as ef   on ef.[KEY] = e.id left join
 FreeTexttable (GeographicalExperience,
 ([Description]), 'xandrick' ) as gef  
 on gef.[KEY] = ge.id left join
 FreeTexttable ([Language],
 ([Language]), 'xandrick' ) as lf   on
 lf.[KEY] = l.id left join
 FreeTexttable (ProjectDetails,
 (Address1,Address2,City,ProjectDescription,Projectname,Projectrole,Province,ServiceRendered,StateorRegion),
 'xandrick' ) as pdf   on pdf.[KEY] =
 pd.id left join FreeTexttable
 ([References],
 (ContactDetails,CurrentPosition,Name,Organization),
 'xandrick' ) as rf   on rf.[KEY] =
 r.id left join FreeTexttable
 (Training, (School,Training),
 'xandrick' ) as tf   on tf.[KEY] =
 t.id

 where uf.[KEY] is not null    OR
 adf.[KEY] is not null   OR cf.[KEY] is
 not null   OR ebf.[KEY] is not null  
 OR edf.[KEY] is not null   OR ef.[KEY]
 is not null   OR gef.[KEY] is not null
 OR lf.[KEY] is not null   OR pdf.[KEY]
 is not null   OR rf.[KEY] is not null 
 OR tf.[KEY] is not null
Другие вопросы по тегам