2012-04-28 2 views
1

SQL 2008 서버에서 contains 및 freetext와 함께 containstable을 사용하여 검색 결과를 순위 매길 수 있음을 읽었습니다. 나는 최근에 처음으로 freetext를 사용했다. 자유 텍스트는 단어를 개별적으로 반복하고 색인 된 열과 비교합니다. 먼저 구문을 검색하고 단일 단어를 검색 할 수 있기를 원합니다.containstable 및 freetext를 사용하여 관련성 순위로 검색

설명 열의 색인이 생성되었다고 가정 해 보겠습니다. 나는이 같은 저장 프로 시저 쿼리를 사용하고 있습니다 :

SELECT id, description, item from table where (FREETEXT(description,@strsearch)) 

예 3의 경우 행 집합은 그들에게 사과와 함께 단어를 포함하고 나는 '사과 케이크'를 검색, 행 세트 ID2로 먼저해야하고 다른 두 따라야합니다,

id1 apple pie 4/01/2012 
id2 apple cake 2/29/2011 
id3 candy apple 5/9/2011 

예 4의 경우 행 집합은 그들에게 음식과 함께 단어를 포함하고 나는 '패스트 푸드 레스토랑'을 검색 행 설정 ID1 (안 정확히 일치하는 다음 먼저해야 ID3로하지만, 열에 '패스트 푸드'가 있기 때문에) 다른 두 사람은 따라야합니다.

id1 McDonalds fast food 
id2 healthy food 
id3 fast food restaurant 
id4 Italian restaurant 

답변

1

이 문서가 도움이됩니까?

MSDN : Limiting Ranked Result Sets (Full-Text Search)

RANK (추가 매개 변수를 사용하여 그 관련성도 순서 (당신이 WEIGHT를 사용하여 영향을 미칠 수있다) 가장 큰 관련을 가진 사람으로 결과를 제한 할 수 있음을 부분적으로 의미).

top_n_by_rank은 단지 N 최고 순위 일치 내림차순으로 복귀되도록 지정하는 정수 값이고, n.

doc에는 FREETEXT의 예제가 없습니다. 단지 CONTAINSTABLE을 참조하십시오. 그러나 이는 CONTAINSTABLEORDER BY에 사용할 수있는 RANK 열을 출력 함을 의미합니다.

관련성에 대한 자신의 정의를 적용 할 방법이 있는지 알 수 없습니다. FTS에 따라 관련성 높은 상위 10 개 항목을 추출한 다음 출력에 자신의 순위를 적용하는 것이 좋습니다. 함수를 사용하여 검색 용어를 나눌 수 있고 일치하는 단어의 수에 따라 정렬 할 수 있습니다. 다음 예제에서는 간단하고 쉽게 repro 위해 하위 쿼리에서 전체 텍스트를 사용하지 않고 실제로 수행중인 작업으로 대체 할 수 있습니다. 매칭을 수행하는 방법을 보여줍니다

IF OBJECT_ID('dbo.SplitStrings') IS NOT NULL 
    DROP FUNCTION dbo.SplitStrings; 
GO 
CREATE FUNCTION dbo.SplitStrings(@List NVARCHAR(MAX)) 
RETURNS TABLE 
AS 
    RETURN (SELECT Item FROM 
     (SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)') 
     FROM (SELECT [XML] = CONVERT(XML, '<i>' 
     + REPLACE(@List, ' ', '</i><i>') + '</i>').query('.') 
      ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y 
     WHERE Item IS NOT NULL 
    ); 
GO 

그리고 간단한 스크립트 :

DECLARE @foo TABLE 
(
    id INT, 
    [description] NVARCHAR(450) 
); 

INSERT @foo VALUES 
(1,N'McDonalds fast food'), 
(2,N'healthy food'), 
(3,N'fast food restaurant'), 
(4,N'Italian restaurant'), 
(5,N'Spike''s Junkyard Dogs'); 

DECLARE @searchstring NVARCHAR(255) = N'fast food restaurant'; 

SELECT x.id, x.[description]--, MatchCount = COUNT(s.Item) 
FROM 
(
    SELECT f.id, f.[description] 
    FROM @foo AS f 

    -- pretend this actually does full-text search: 
    --where (FREETEXT(description,@strsearch)) 

    -- and ignore how I actually matched:  
    INNER JOIN dbo.SplitStrings(@searchstring) AS s 
    ON CHARINDEX(s.Item, f.[description]) > 0 

    GROUP BY f.id, f.[description] 
) AS x 
INNER JOIN dbo.SplitStrings(@searchstring) AS s 
ON CHARINDEX(s.Item, x.[description]) > 0 
GROUP BY x.id, x.[description] 
ORDER BY COUNT(s.Item) DESC, [description]; 

결과 :

id description 
-- ----------- 
3 fast food restaurant 
1 McDonalds fast food 
2 healthy food 
4 Italian restaurant 
+0

덕분에 많이 먼저 함수를 만듭니다. MSDN 페이지와 코드에서 올바른 방향으로 나를 지적했습니다. 그럼 내가 http://msdn.microsoft.com/en-us/library/aa172823%28v=sql.80%29.aspx 조금 혼란 스럽지만, 그것을 통해 일한 – Patriotec

+0

@ 애런, 2 선택 사용 목적은 무엇입니까 진술. 외부 select 문을 주석 처리하고 order by 절을 내부 select 문으로 이동하면 동일한 결과가 나타납니다. – iMatoria

관련 문제