2013-05-29 19 views
5

jqueryであれc#であれ、正確な検索機能が必要です。可能であれば、私はGoogleの:-)のように華麗な探したいより正確な検索を作成するにはどうすればよいですか?

そこでここでは、C#のコードです:

簡単な説明:これは完全な情報を持っているデータベース内のすべてのユーザーを検索
が。現在ログインしているユーザー以外のすべてのユーザーを検索します。

string[] ck = keyword.Split(new string[] { " ", ",", "." }, 
          StringSplitOptions.RemoveEmptyEntries); 

using (dbasecore db = ConfigAndResourceComponent.BaseCampContext()) 
{ 
    var results = (from u in db.users 
        join uinfo in db.userinfoes 
         on u.UserID equals uinfo.UserID 
        where u.UserID != userid && 
         (ck.Contains(u.LastName) || ck.Contains(u.FirstName) || 
         ck.Contains(u.MiddleName) || ck.Contains(u.LoginID)) 
        orderby u.LastName, u.FirstName, u.MiddleName ascending 
        select uinfo).Skip(skip).Take(take).ToList(); 

    return (from i in results select new UserInfo(i)).ToList(); 
} 

そして結果:それはより多くのキーワードに一致するので、

enter image description here

囲まれた名前は、検索項目の一番上にある必要があります。

+0

全文ではランクがあり、それを使用してください – vikas

+0

あなたのカラムはフルテキストですか – vikas

答えて

1

を簡単にするために、私はこのようなユーザエンティティと一つのテーブルを使用します。

ここ
public class User 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
} 

あるユーザーごとにマッチ値を算出し、唯一のいくつかのキーワードに一致するものを選択し、クエリ(EFで動作)、試合値によって順序付け結果:(すべてのフィールドが一致した場合)3に(なしフィールドがキーワードに一致した場合)

var keywords = new [] {"Sergey", "Berezovskiy"}; 

var users = from u in context.Users 
      let match = (keywords.Contains(u.FirstName) ? 1 : 0) + 
         (keywords.Contains(u.LastName) ? 1 : 0) + 
         (keywords.Contains(u.MiddleName) ? 1 : 0) 
      where match > 0 
      orderby match descending, 
        u.LastName, u.FirstName 
      select u; 

レンジ可変match0からの値を持つことになります。

+1

これは単純で働きやすいので、私は答えとして受け入れました。この例をありがとう。 – fiberOptics

0

まあ...あなたでしたselectで特定の注文を指定してください。私はあなたが持っている注文だと思いますよね?

は、検索語が結果に存在しているどのように多くカウントすることにより、結果をランク付けするランキング関数を書いてください...あなたが望むものを達成するために、いくつかの方法

5

あります

1)は、独自のランキングを書きますアルゴリズム。つまり、Linqを使用して結果を取得し、独自のランキング機能を使用して並べ替えることを意味します。要求を単語に分割し、それぞれの結果や複雑なものの数を数えたり、条件間の距離の測定、いくつかの条件の追加などがあります。LikeクエリはSQLでは遅く、既に書かれているものを書く必要があるため、この方法はお勧めしません。

2)SQL Server全文検索:http://msdn.microsoft.com/en-us/library/ms142524(v=sql.105).aspxを使用します。私はSQL Serverのフルテキスト検索を使用するファンではありませんが、それは良いと実行可能なソリューションです。

3)サードパーティフルテキスト検索を使用すると、いくつかの選択肢がありますが、Lucene(http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net)がおそらく.netで最もよく使用されます。これにより、スピードと柔軟性が得られます。さまざまな方法でデータのインデックスを作成できますが、索引作成には十分に対応できます。私が一番大好きなSolrのようなLuceneの上にもAPIがありますが、あなたの場合は多すぎるかもしれません。

1

Googleと同じくらい鮮明であるかもしれませんが、非常に簡単な技術を使って許容できるものを実現できます。

WHERE句では、WHERE句の代わりに、それぞれの成功した基準に値を割り当てる式を追加して、それらを加算して最終スコアを得ることができます。たとえば、次のように

WHERE (ck.Contains(u.LastName)? 1 : 0) + (ck.Contains(u.FirstName)? 2 : 0) + ... 

LINQは、三項演算子をサポートしているかどうか、それがない場合は、ループとあまりにも手動による方法を使用して同じことを達成できるかどうかわかりません。すべての用語の合計は、より近い一致である候補者に高いスコアを与える。この列で並べ替えることができます。

関連する問題