2009-11-26 3 views
9

나는 매우 기본적인 시나리오라고 생각하지만,이 글은 SQL Server 전체 텍스트 카탈로그 및 인덱스를 사용하여 쉽게 들릴 수 있다고 생각합니다.전체 텍스트 인덱스가 포함 된 ContainsTable 및 부울 논리가 포함 된 여러 열

이름과 성이 2 개 있습니다. 나는 누군가가 "John Smith"라는 사람과 에 일치하는 사람을 입력하면이 먼저 나오고 마지막 사람이 먼저 와야한다는 것과 같은 전문 검색을 지원하고자합니다.

여러 열에 인덱스를 쉽게 만들 수 있고 여러 열을 쉽게 검색 할 수 있지만 점수에는 여러 열이 반영되지 않습니다. CLAUSE_HERE 인 경우 그 문구 중 하나를 필드에 존재하지 않기 때문에

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>') 
  1. 는 "존 스미스는"나는 어떤 결과를 얻을 수 없습니다.
  2. "john OR smith"인 경우 두 필드 중 하나의 이름을 가진 모든 사용자가 도움이되지 않는 순서로 정렬됩니다.
  3. "john AND smith"인 경우 두 필드가 모두 포함되어 있지 않으므로 결과가 표시되지 않습니다.

유일한 해결책은 각 필드에 containstable을 실행하는 쿼리를 생성하고 일부 수학을 수행하며 점수를 합산하는 것입니다. 그 주위에 더 쉬운 방법이 있습니까? 제 실제 쿼리에는 훨씬 많은 필드가 있습니다 - 이것은 단순화 된 예제입니다.

답변

11

computed column은 검색에 관심이있는 입력란 (검색 형식에 맞는 방식)과 전체 텍스트 색인을 함께 만듭니다.

질문에서 설명한 동작 때문에이 방법으로 전체 텍스트를 사용하려는 경우 이것이 유일한 해결책이라는 것을 알고 있습니다.

+0

완전히 작동했습니다. 왜 전체 텍스트가 자동으로 이렇게하지 않습니까? 나는 여러 컬럼에 전체 텍스트를 적용하는 것이 out-of-the-box처럼 작동 할 것이라고 생각했다. 맞춰봐. –

0

당신은 그것을 테스트해야하지만 ISABOUT() 함수를 사용하여 각 키워드에 가중치를 적용 할 수 있는지 궁금합니다. 검색 절은 다음과 같을 수 있습니다.

ISABOUT(john weight(0.2), smith weight(0.8)) 
+0

나쁜 생각은 아니지만 작동하지 않습니다. 채점 방식이 열 사이에서 합산되는 것처럼 보이지 않습니다. 그래서 "존 스미스"는 내 테스트에서 "존 존스"와 정확히 같은 점수를 얻습니다. –

+0

어떤 버전의 SQL Server를 사용하고 있습니까? 샘플/테스트 스크립트가 있습니까? – RickNZ

관련 문제