2012-01-23 8 views
1

1つの検索ボックスのみを使用して複数の列を使用してデータベースを検索するのが最善の方法は何でしょうか。以下のシナリオ:1つの検索ボックスを使用して複数のデータベース列を検索する

検索ボックスに詳細を入力して顧客を検索できるようにしたいと考えています。名前、ポストコード、またはIDのいずれかになります。 1つ以上の検索基準を使用して1つの検索を実行することもできます。たとえば、名前とIDで検索できます(Bob Smith cus345)。

私が取った最初のアプローチは、検索語を分割して各スペースを別々の単語に分けることでしたが、これは顧客名が3〜4語を含む可能性があるため、落ちています。これは条件文のトンにつながることができますが、これは非効率的なので、これを行うためのより良い方法があるかどうか疑問に思っていました。

ユーザーは任意の順序で検索することができますので、私はあなたが正規表現を使用することができ

+1

類似の検索ニーズがあり、ストアドプロシージャを使用する方がはるかに高速で実装が容易であることがわかりました。 –

+0

これで、ストアドプロシージャをasp.net mvc3の検索ボタンのポストイベントにリンクする方法 – CallumVass

+0

テーブルの大きさはどれくらいですか?何行ですか?これは実際にパフォーマンス上の問題ですか、それともあなたはそれだけを想定していますか?あなたが100k行以下であれば、テーブルスキャンだけでかなり安全だと思います。 – usr

答えて

2

(すなわち名前、その後、郵便番号で検索し、ID、またはなどの名前とidと)これを行うには困難な課題を見つけますポストコードのような特定の用語を検出することができますが、いずれの方法でも条件の負荷で終了すると言っても間違いありません。

Lucene.netの使用を強くお勧めします。実装するのは難しいことではありませんが、デフォルトでランク付けされた結果を提供し、繁盛しています(ストアドプロシージャが複数クエリに比べて高速です)。また、特定のフィールドに重み付け/偏りを付けることができるので、部分的なポストコードの一致は、最初の名前の一致よりも重くなります。

検索の分割に関して、私は通常、*や(のような予約文字のチェックを実行します。ユーザーが複雑な検索を自分自身で実行できるようにしたくない場合は完全に除外します。ワードboundarys時および実行し、検索。私の知る限りのLuceneのLINQのプロバイダはあまりにもそこにある知っているように

+1

Lucene.NETはデータベースではなくドキュメントを検索しているようですか?私が間違っていない限り? – CallumVass

+0

ほぼLuceneを使用してデータベースを検索することはできませんが、db内のコンテンツに基づいてLuceneインデックスを構築します(たとえば、すべての顧客名、ポストコード、顧客ID)。索引を検索すると、このタイプのデータに対する問合せでは、ランク付けされた結果を引き出すことが非常に効率的になるように設計されています。結果のページから、たとえば10の顧客であれば、そのレコードを選択してデータベースにアクセスできます。 – Digbyswift

+0

ああ、お返事ありがとう、私は明日それを試してみましょう! – CallumVass

0

私は、同様の要件を持つプロジェクトでfull text searchを使用だけではなく、EFの、私が使っていましたlinqからsqlに変換することができますが、特定の全文検索関数をEFを使用してテーブル関数を使用してマップすることができます。

+0

フルテキスト検索は複数の列に対して機能しますか? – CallumVass

+0

http://msdn.microsoft.com/en-us/library/ms142488.aspx –

+0

またはこの1つhttp://msdn.microsoft.com/en-us/library/ms176078.aspx(freetext) –

関連する問題