2013-04-16 4 views
0

SQL Server 데이터베이스에서 전체 텍스트 검색을 사용하여 여러 테이블의 결과를 반환합니다. 가장 단순한 상황은 개인 이름 필드와 설명 필드를 검색하는 것입니다. 이므로 (희망) 내가 프로젝트 설명 필드에서 경기를 통해 사람의 이름의 일치에 크게 가중하는 것을 시도하고, 위의 취소여러 열에서 전체 텍스트 검색 점수

select t.ProjectID as ProjectID, sum(t.rnk) as weightRank 
from 
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL 
    ON FT_TBL.ProjectID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (FirstName, LastName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 
) 
group by ProjectID 

: 나는이 작업을 수행하는 데 사용하는 코드는 것 같습니다. 내가 '존'과 같은 것을 검색한다면, 존에 이름이있는 모든 프로젝트는 (예상대로) 크게 비중을 둘 것입니다. 내가 겪고있는 문제는 누군가가 '존 스미스'와 같은 정식 이름을 제공하는 검색에 있습니다. 이 경우 검색의 절반 만이 firstname/lastname 열에서 일치하는 것으로 추정되므로 이름 일치가 훨씬 적습니다. 대부분의 경우 이는 입력 한 이름과 정확히 일치하는 사람이 반드시 검색 결과 상단 부근으로 반환되지는 않는다는 의미입니다.

처럼 내 새 쿼리 보이는 있도록 별도로 firstname/lastname 각 필드를 검색하고 함께 자신의 점수를 추가하여이 문제를 해결 할 수 있었다 :

select t.ProjectID as ProjectID, sum(t.rnk) as weightRank 
from 
(
select KEY_TBL.RANK * 1.0 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
INNER JOIN FREETEXTTABLE(Projects, Description, @SearchText) AS KEY_TBL 
    ON FT_TBL.ProjectID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (FirstName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 

    union all 

select KEY_TBL.RANK * 50 as rnk, FT_TBL.ProjectID as ProjectID 
FROM Projects as FT_TBL 
... <-- complex unimportant join 
    INNER JOIN People as p on pp.PersonID = p.PersonID 
INNER JOIN FREETEXTTABLE(People, (LastName), @SearchText) AS KEY_TBL 
    ON p.PersonID=KEY_TBL.[KEY] 
) 
group by ProjectID 

내 질문 :

이 이것을인가 접근 방식을 택해야합니다. 또는 전체 텍스트 검색을 텍스트 목록처럼 열 목록에서 작동하도록하는 방법이 있습니다. firstnamelastname 열을 하나의 name 열로 처리하여 점수가 높아집니다 str과 일치 이름과 성을 모두 포함하는 사람?

답변

1

나는 최근에이 문제를 겪었고 계산 된 열을 사용하여 필요한 열을 하나의 문자열로 연결 한 다음 해당 열에 전체 텍스트 인덱스를 사용했습니다.

계산 된 열의 가중치 필드를 복제하여 가중치를 얻었습니다.

즉 성은 3 번 및 이름이 한 번 나타납니다.

ALTER TABLE dbo.person ADD 
PrimarySearchColumn AS 
COALESCE(NULLIF(forename,'') + ' ' + forename + ' ', '') + 
COALESCE(NULLIF(surname,'') + ' ' + surname + ' ' + surname + ' ', '') PERSISTED 

각 읽기에서 열이 계산되지 않도록 persisted 키워드를 사용해야합니다.

+0

이 문제에 대한 의견을 잊어 버렸습니다. 나는 약간 다른 접근법을 취해 미래에 그것으로 나의 질문을 업데이트 할 것이다. 그러나 이것 역시 나에게 잘 맞았다. 감사! – Matthew

+0

개별 열을 사용하여 발견 한 문제점 중 하나는 각 열에 대해 생성 된 순위가 동일한 숫자를 기반으로하지 않는다는 것입니다. 동일하거나 유사한 검색에 대해 완전히 다를 수 있습니다. 한 열에는 700에서 800 사이의 순위가 있고 다른 열에는 10에서 20 사이의 순위가있을 수 있습니다. 생성 된 순위를 조사하기 위해 실행할 수있는 저장 프로 시저가 있습니다. – ScottG

+0

의견을 보내 주셔서 감사합니다. 잊어 버렸습니다. – Matthew

관련 문제