2017-12-22 19 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 のフルテキストエンジンは、データがインデックスされるときに中間インデックスを作成します。フルテキスト エンジンは、これらのインデックスを必要に応じて大きなインデックスにマージします。この プロセスは何度も繰り返すことができます。次にフルテキストエンジンは 1つの大きなマスターインデックスにすべての中間インデックスを組み合わせた "マスターマージ"を に実行します。

各中間インデックスレベルで統計情報が収集されます。インデックスがマージされると、 統計情報がマージされます。一部の統計値 は、マスターマージ処理中にのみ生成されます。

クエリ結果セットのランク付け中、SQL Serverは 中間インデックスの統計を使用します。これは、中間の インデックスがマージされているかどうかによって異なります。結果として、中間インデックスがマージされていない場合、ランク付け統計は の精度が変わる可能性があります。 これは、同じクエリがフルテキストインデックスデータが追加、変更、および削除されると、 の異なるランク結果を返すことができる理由を説明します。 と小さいインデックスがマージされます。

インデックスのサイズと計算の複雑さを最小限に抑えるために、 の統計は丸められることがよくあります。

簡単に言えば、ランキングは徐々に収集され、洗練された統計に基づいています。データチャンク統計は結合され、いくつかの丸め処理が行われています。同じサーバー上でも、異なるサーバーはもちろんのこと、クローラーがチャンクをどのように索引付けするかについて、決定的な反復可能なパターンはありません。インデックス作成時にテーブルの実際のストアのソート順、ストレージのページ区切り、コア、および共有メモリプールの可用性など、何かが発生する可能性があります。コメントは以下の

アップデート:私はこれを実行した実験では

を(例AオフCONTAINSTABLE)を数回上の非常に同じのSQL Server 2016のExpressの

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"に注意してください。全文索引に入力できる時間。 1〜5秒と結果はいずれも5秒以上

Tanzania 32 
Italy  16 

あるとの結果が

Tanzania 48 
Italy  32 

です...そしてそれは文字通り同じサーバとすることができような単純なデータです。

+0

ご迷惑をおかけして申し訳ございません。しかし、両方のサーバーのランクはかなり異なっています。データを見ると、両方のサーバーのインデックス列は同じ値を持ちますが、ランクは20以上異なります。それは普通だと思われますか? – Jie

+0

私が知っている限り、ランクは検索結果を注文するだけです。ランク順の 'containstable'の結果が同じである限り、絶対ランク値はほとんど無関係です。 –

関連する問題