6

ここ数時間、私は SQL Server の全文検索のあらゆる種類のさまざまなバリエーションをいじっていました。しかし、ランキングの仕組みがいまいちよくわかりません。私はいくつかの例に出くわしましたが、それらが他のものよりもどのようにランク付けされているかについて本当に混乱しています. 例えば

インデックスが作成されていない 5 つの列以上のテーブルがあります。すべてがnvarcharフィールドです。

私はこのクエリを実行しています(ほぼ..別の名前で再入力しました)

SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between
SET @SearchString = '"'+@SearchString+'*"'
print @SearchString;

SELECT ms.ID, ms.Lastname, ms.DateOfBirth, ms.Aka, ms.Key_TBL.RANK, ms.MiddleName, ms.Firstname
FROM View_MemberSearch as ms
INNER JOIN CONTAINSTABLE(View_MemberSearch, (ms.LastName, ms.Firstname, ms.MiddleName, ms.Aka, ms.DateOfBirth), @SearchString) AS KEY_TBL
    ON ms.ID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 0
ORDER BY KEY_TBL.RANK DESC;

したがって、11/05/1964 JOHN JACKSONを検索すると、 "11/05/1964" OR "JOHN*" OR "JACKSON*"と次の結果が得られます。

ID -- First Name -- Middle Name -- Last Name -- AKA -- Date of Birth -- SQL Server RANK
----------------------------------------------------------------------------------
1  |  DAVE       |  JOHN        |  MATHIS     | NULL | 11/23/1965    |  192
2  |  MARK       |  JACKSON     |  GREEN      | NULL | 05/29/1998    |  192
3  |  JOHN       |  NULL        |  JACKSON    | NULL | 11/05/1964    |  176
4  |  JOE        |  NULL        |  JACKSON    | NULL | 10/04/1994    |  176

最後に私の質問です。行 1 と 2 が行 3 より上にランク付けされている方法と、行 3 が行 4 と同じようにランク付けされている理由がわかりません。検索文字列が名と姓にも一致するため、行 2 がはるかに高いランクになるはずです生年月日として。

OR を AND に変更すると、結果が得られません。

4

4 に答える 4

6

AND 句と OR 句が複数の列に適用されないことがわかりました。列をマージするインデックス付きビューを作成すると、より良い結果が得られます。私の過去の質問を見ると、あなたのシナリオに合った情報が見つかります。

また、「*」を追加しない方がよいこともわかりました。より多くの一致が得られると思いましたが、悪い結果を返す傾向がありました (特に長い単語の場合)。妥協点として、* は長い単語にのみ追加できます。

あなたが与える例は間違いなく奇妙です。

于 2008-11-26T23:07:02.607 に答える
2

完全に同等というわけではありませんが、私が尋ねたこの質問 ( How-to: Ranking Search Results ) が参考になるでしょうか?

于 2008-11-27T22:33:22.363 に答える
1

DoB基準を削除するとどうなりますか?

MS全文検索は、実際には理解とカスタマイズが難しいブラックボックスです。Luceneがカスタマイズに最適であるのとは異なり、ほとんどそのまま使用できます。

于 2008-11-26T21:11:46.880 に答える
1

君たちありがとう。

率直に言って、AND と OR が列をまたがらないというのは正しかったのですが、これは最初は気づきませんでした。

最良の結果を得るには、5 つの列すべてをビューの 1 つの列に結合する必要がありました。次に、その単一の列を検索します。そうすることで、余分なものを使わずに、私が望んでいた正確な結果が得られました.

変換後の実際の検索文字列は、「Word1*」と「Word2*」になりました。

% 記号を使用しても、msdn が実行すべきと言ったことは実行されませんでした。つまり、単語 josh を検索して、検索時に「Josh%」に変更された場合、「Joshua」は見つかりません。かなりばかげていますが、「Josh*」を使用すると、joshua が見つかります。

于 2008-12-02T16:22:55.327 に答える