まず、フルテキスト検索を使用して完全一致を取得する方法がないようです。これは、フルテキスト検索方法を使用するときに非常に議論されている問題のようで、目的の結果を達成するためのさまざまなソリューションがありますが、ほとんどが非常に非効率的です。私は最近、データベースのボリュームのためにフルテキスト検索を使用する必要があります。私は最近、より正確な結果を得るためにこれらのソリューションの1つを実装しなければなりませんでした。SQL Serverのフルテキスト検索で、完全一致とフォールバックの一致
どのように動作するので、全文検索のランキング結果を使用できませんでした。たとえば、Toy Story
という映画を検索した場合、「Story
」と「Toy
」という単語が見つかったため、完全一致ではなくThe Story Behind Toy Story
という映画がありました。
ユーザーがレコードにアクセスする度に「人気度」と呼ばれる自分のランキングを追跡します。私はこのデータポイントを使用して、ユーザが何を探しているのかを判断するのに役立ちます。
また、LIKE検索にフォールバックして完全一致を返さない場合があるという問題もあります。私。 Goonies
を検索するとThe Goonies
(最も人気のある結果は)
ので、ここではこれを達成するための私の現在のストアドプロシージャの例である返す必要があります:約5,000回分
DECLARE @Title varchar(255)
SET @Title = '"Toy Story"'
--need to remove quotes from parameter for LIKE search
DECLARE @Title2 varchar(255)
SET @Title2 = REPLACE(@title, '"', '')
--get top 100 results using full-text search and sort them by popularity
SELECT TOP(100) id, title, popularity As Weight into #TempTable FROM movies WHERE CONTAINS(title, @Title) ORDER BY [Weight] DESC
--check if exact match can be found
IF EXISTS(select * from #TempTable where Title = @title2)
--return exact match
SELECT TOP(1) * from #TempTable where Title = @title2
ELSE
--no exact match found, try using like with wildcards
SELECT TOP(1) * from #TempTable where Title like '%' + @title2 + '%'
DROP TABLE #TEMPTABLE
このストアドプロシージャが実行され、かつ十分なそれはだクレイジー私のサーバーを膝に持ってこないでください。しかし、これにもっと効率的なアプローチがあるかどうか本当に知りたいですか?ありがとう。
ORDER BY CASEセクションは何とか動作しているので説明できますか?「ORDER BYの位置番号0が選択リストの項目数の範囲外です」というケースがありますが、私は非常に混乱しています。ありがとう – bfritz
@bfritz ORDER BY式は結果のインデックスを参照しません。しかし、結果は、式の値の順にリストされます。したがって、タイトルが完全一致である行の場合、最初の式( 'CASE WHEN m.title = @ title2 THEN 0 ELSE 1 END')は0と評価されます。この行は、タイトルが他のすべての行の前にリストされます完全一致これらの行については、最初の式は1と評価されます。 – flup
レスポンスのおかげで、重いストアドプロシージャ(1日に2,500万回以上のリクエスト)を最適化しようとしているので、あなたの内部結合アプローチが、2つの選択肢を持つ#tempテーブルへの選択100より少ないリソースを使用する場合、それに対して実行されます。あなたの方法は確かに読めるように見えます。 – bfritz