2009-07-06 9 views
1

私は3つのテーブルがリンクしています。レストラン、料理、料理の種類。 レストランが(それは悪い言葉遣いだが、あなたのアイデアを得る?)食品の多くの料理を販売することができ全文検索、ベストマッチの結果をフィルターにする

は、だから私はレストランの全文を設定している:名前、CityTown、郵便番号やCuisineTypeには:私は1件の検索ボックスを持っている

名前私のホームページには、ユーザタイプの結果が最もよく一致するようにフィルタリングされています。

ここにいくつかの例があります:SearchText = "Royal D Ed" 王朝と名づけられた場所のレストランがあり、町はエジンバラです。 しかし、私の一番の結果は、どこかのwherの町は、名前だけでなくDで始まります。これは最高のマッチではありません。

私はあなたに私の格納されたprocを見せてくれます。プロトタイプですので、派生した名前はちょっと怪しいです。

ALTER PROCEDURE [dbo].[RestaurantsFullText] 
    @searchText nvarchar(255) 
AS 
SELECT 
    b.*, 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0)/30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) as rankCount 
FROM 
    Restaurants b 
left JOIN Cuisines c on b.Id = c.RestaurantId 
left join CuisineType a 
ON c.CuisineId = a.id 

left JOIN 
containstable(Restaurants, Name, @searchText) bkt 
ON b.id = bkt.[Key] 

left JOIN containstable(CuisineType, Name, @searchText) akt 
ON a.id = akt.[Key] 

left JOIN containstable(Restaurants, Postcode, @searchText) akt1 
ON b.id = akt1.[Key] 

left JOIN containstable(Restaurants, citytown, @searchText) akt2 
ON b.id = akt2.[Key] 

where 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0) /30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) > 5 
ORDER BY 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0)/30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) asc 

問題はジョインにあり、ランクが計算される方法だと思います。

私はそれが "ロイヤルダイナスティーエジンバラd"を渡す場合、王朝はまだ最高の試合ですので、それが欲しいです。

フィルタであるため、dで始まる他の都市の町との一致は返されません。

私はこの点で非常に助かります。

答えて

2

迅速かつ簡単に最初のステップ

をし、ブール型検索文字列を構築する「王室」(SQL Server 2008を使用してinbuilt function可能な場合はノイズワードを削除がある場合)私は、文字列を解析します既存のクエリで実行できる「d *」と「ed *」があります。結果が返されない場合は、データが単一のビューまたはテーブルに統合され、FTSがすべての別個のテーブルではなく、そのEDがレストランテーブルに見つからない可能性があるため、およびで無視されます。

これで十分ではありません。それが生きているなら私は停止し、人々がやっている検索を見て、彼らが見ているデータはそれらの結果を改善するためにより密接に働いています。それが不可能な場合。私はあなたがそれを変更する前にソフトウェアをどのように使用しているかを知っているので、検索を変更する前にその機能を構築することにしました。物事を改善するためのインターフェース方法があるかもしれません。例えばロイヤル・ダイナスティを検索ボックスに入力するオプションとして人々に提供することで、インターフェースの問題に対処する方が良いでしょう。

あなたのアプリでレストランの名前、料理、または場所をどれだけ多くの人が検索するか分かりませんが、これはかなり一般的です。人々があなたのログから探しているものに応じて、私は物事について別々に行くでしょう。この種のシナリオでは、コード化されたシングルパスクエリではなく、より動的に検索を構築します(検索ごとに処理能力が向上するので、考慮する必要があります)。

データ、またはシソーラスベースのワードスプリッタで、データの知識の一部を使用して結果の優先順位付けを行います。あなたの料理リストにRoyal Dを見つけることを試みるのではなく、あなたのレストランのリストで最初にそれをあなたの検索文字列から削除する方が良いでしょう。縮小された検索文字列に対して、場所/料理のレストランからのすべての一致を検索します。そうすれば、料理と場所データの検索はレストランの一致に基づいているため(データセットが減るにつれてすばやくなるはずです)、データを少なくして検索しています。ポストコード文字列EDが可能性があります。

検索結果にヒントがあります。検索が非常に迅速であれば、ユーザーは検索結果の画面上でより良い結果を得るために複数回検索することが多いでしょうか?エジンバラがあなたの検索を改善する助けになることを意味しましたか?

+0

は早朝にプレーしました。幸運:) – u07ch

+0

ありがとう、私は少し設計を更新しました(私は一度に少しビットをやっているので、デザイナーではありません)) 私は検索とフィルタとして他のfatures上で次の数日間過ごす必要があると思う郵便番号ですべてが私の頭の中でhaをしている。私はSQLを全く使っていない – ddd

関連する問題