Использование полнотекстового поиска в SQL Server 2005 по нескольким таблицам, столбцам - PullRequest
0 голосов
/ 07 июня 2010

У меня проблема, я создал полнотекстовый поисковый запрос, который возвращает запись (записи), в которой предоставленные мной параметры соответствуют каждому из полей (с полнотекстовым индексированием) нескольких таблиц. Проблема в том, что когда 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 ]

1 голос
/ 08 июня 2010
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"')
0 голосов
/ 08 июня 2010

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

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

0 голосов
/ 08 июня 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...