2017-12-22 28 views
0

2 개의 다른 서버에 전체 텍스트 카탈로그가있는 동일한 테이블이 있습니다. 두 서버의 테이블 모두 색인이 생성되고 동일하게 설정됩니다. 나는 서비스를 다시 시작하고 카탈로그를 재구성하려고 시도했다. 두 서버에서 동일한 쿼리를 실행하면 두 서버에 표시된 FREETEXTTABLE의 RANK가 다르게 표시됩니다. 다음은 샘플 쿼리입니다.SQL - 동일한 전체 텍스트 검색이 다른 서버에서 다른 결과를 반환하는 이유는 무엇입니까?

SELECT *COLUMNS* 
FROM TABLE 
INNER JOIN FreeTextTable (TABLE, INDEXEDCOLUMN, N'"Sabariah Mohamed Ali" or "Ali Mohamed Sabariah"', 100) as KEY_TABLE ON TABLE.INDEX = KEY_TABLE.[KEY] 
WHERE KEY_TABLE.rank > 30 

Select *COLUMNS* 
from TABLE 
Inner Join Containstable (TABLE, INDEXEDCOLUMN, N'"*Sabariah" or "Sabariah*" 
or "*Mohamed" or "Mohamed*"', 100) as KEY_TABLE on TABLE.INDEX = 
KEY_TABLE.[KEY] 
where KEY_TABLE.rank > 30 

표의 색인 된 열은 "Sabariah Binti Mohamed Ali"를 포함합니다. 그래서 결과를 반환해야하지만 KEY_TABLE에서 RANK를 확인하면 두 서버가 다른 번호를 반환합니다.

내 문제는 다음과 유사하다고 생각

, Full text search returns different results on test and live

편집 : 비슷한 문제를 찾을 수는, 더미 테이블을 생성 인덱스 및 카탈로그를 만들뿐만 아니라, 작동하지 않는 제공하는 솔루션을 시도했다. 인덱스가 구축되면 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a5532c9a-ece2-40cb-a8ac-4f53ba96175c/problem-with-rank-on-freetexttable?forum=sqldatabaseengine#f51bb4a9-725b-499f-961a-9492bed0a1f0

답변

0

How Search Query Results Are Ranked (Full-Text Search)

에 따르면, 순위에 사용할 통계가 수집됩니다. 전체 텍스트 카탈로그를 작성하는 과정에서 단일 인덱스 구조에 직접 이 표시되지 않습니다. 대신 SQL 용 전체 텍스트 엔진은 데이터가 인덱싱됨에 따라 중간 인덱스를 만듭니다. 그런 다음 전체 텍스트 엔진은 필요에 따라이 인덱스를 더 큰 인덱스로 병합합니다. 이 프로세스는 여러 번 반복 될 수 있습니다. Full-Text Engine은 개의 큰 마스터 인덱스에 모든 중간 인덱스를 결합하는 "마스터 병합"을 수행합니다.

통계는 각 중간 색인 수준에서 수집됩니다. 통계는 인덱스가 병합 될 때 병합됩니다. 통계 일부 값은 마스터 병합 프로세스 중에 만 생성 될 수 있습니다.

쿼리 결과 집합의 순위를 지정하는 동안 SQL Server는 중간 인덱스의 통계를 사용합니다. 이것은 인덱스 중간에 이 병합되었는지 여부에 따라 다릅니다. 결과적으로 중간 색인이 병합되지 않은 경우 순위 통계에 의 정확도가 다를 수 있습니다. 전체 텍스트 인덱싱 된 데이터가 추가, 수정 및 삭제됨에 따라 같은 쿼리가 다른 순위 결과 인 을 반환 할 수있는 이유는 여기에 설명되어 있습니다. 및 더 작은 인덱스가 병합 될 때.

인덱스의 크기와 계산 복잡성을 최소화하기 위해 통계는 종종 반올림됩니다.

요약하면 순위는 점진적으로 수집되고 정제 된 통계를 기반으로합니다. 데이터 청크 통계가 결합되어 일부 반올림이 발생합니다. 크롤러가 동일한 서버에서도 청크를 인덱싱하는 방법에 대해 결정적인 반복적 패턴이 없으며 다른 서버는 말할 것도 없습니다. 인덱싱이 발생할 때 실제 스토어 정렬 순서, 저장 페이지 매김, 코어 및 공유 메모리 풀 가용성과 같은 기능을 사용할 수 있습니다.

업데이트 다음과 같은 의견 : 나는

CREATE TABLE Flags ( Country nvarchar(30), FlagColors varchar(200), CONSTRAINT FlagKey PRIMARY KEY CLUSTERED (Country) ); INSERT Flags VALUES ('France', 'Blue and White and Red'); INSERT Flags VALUES ('Italy', 'Green and White and Red'); INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue'); GO CREATE FULLTEXT CATALOG TestFTCat; CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat; GO WAITFOR DELAY '00:00:10'; --< "Crucial value" SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC; DROP FULLTEXT INDEX ON Flags; GO DROP FULLTEXT CATALOG TestFTCat; GO DROP TABLE Flags; GO 

"Crucial value"을 유의하시기 바랍니다 익스프레스

바로 그 SQL 서버 2016에 (예 A 오프 CONTAINSTABLE) 여러 번 실행 한 실험

: 전체 텍스트 색인을 채울 수있는 시간. 1 ~ 5 초 그 결과 더 이상 5 초 이상

Tanzania 32 
Italy  16 

하고 결과는

Tanzania 48 
Italy  32 

입니다 ... 그리고 그 말 그대로이 될 수있는만큼 간단한 동일한 서버와 데이터입니다.

+0

내가 틀린 질문을하면 죄송합니다. 그러나 두 서버의 순위는 상당히 다릅니다. 데이터를 살펴보면 두 서버의 인덱스 열은 같은 값을 갖지만 순위는 20 이상 차이가납니다. 그게 정상이라고 생각하니? – Jie

+0

내가 이해하는 한 순위는 검색 결과를 주문하기위한 것입니다. 순위에 따라 정렬 된'containstable '의 결과가 동일하다면, 절대 순위 값은 거의 무의미하다. –