2016-05-27 12 views
2

私は現在、ユーザーが質問したり答えたりできるフォーラムを構築しています。 ユーザーが特定の質問を見やすくするために、私は検索エンジンを構築しようとしています。 そのためのコード:発生状況に基づいて結果を並べ替えます

List<QuestionDto> dto = _db.Questions.Where(x => (x.Title.Contains(temp) || x.Message.Contains(temp) || (x.User.FirstName + " " + x.User.LastName).Contains(temp) || x.User.LastName.Contains(temp)) && (categoryId == null || x.Category.CategoryId == categoryId)) 
      .Select(question => new QuestionDto { QuestionId = question.QuestionId, 
       Votes = question.Votes, Title = question.Title, 
       Message = question.Message, CategoryName = question.Category.Name, 
       EditDate = question.EditDate, DateOfCreation = question.DateOfCreation, 
       User = new UserDto { UserId = question.User.Id, FirstName = question.User.FirstName, LastName = question.User.LastName, ImageFile = question.User.ImageFile }, 
       Tags = question.Tags.Select(x => x.Tag).ToList() 
      }).ToList(); 

文字列の一時は、タイトル、メッセージまたはユーザ名のどちらかがクエリに一致するかどうかを確認するために、質問を検索するために使用されます。

ここで達成しようとしているのは、質問で見つかったヒットの量を結果に並べ替えることです。だから、例えば単語「PHP」のためのユーザー検索結果は以下のようになり場合:

質問1:PHPは、10回を発見された 質問2:PHPが見つかった5回 などなど...

どうだろう1つこれにアプローチ?

+2

あなたについてのプログラミングQを尋ねるQ&Aサイト、プログラミングQ&Aサイトに...大胆な動き:-) –

答えて

2

私は、あなたがContains()でdbで検索するのに使ったプロパティのリスト内で一時単語の出現を見つけたいと仮定します。

これは段階的なプロセスであり、質問IDと発生数を含む辞書を提供します。この辞書を使って質問リストを注文することができます。

もちろんこれは最適化することができます。

注文する質問が必要な場合は、辞書を使用して注文することができます。出現回数のみを表示する必要がある場合は、次の方法でデータを提供する辞書が作成されます:質問#QuestionId、検索された文字列の発生数。

その単語がPHPであると仮定すると、:、などとなります。レコードは辞書では注文されません。

私はその辞書の注文ステップを追加しました。

あなたのアプローチでRegexを使用しようとすると、あなたはselectステートメントでRegexを使うことはできませんが、メモリ内のすべてのレコードを(.ToList()の後に)持っていればRegexを使うことができます。参考として、次の質問を使用してください:Using "Match" in a Linq statement

List<QuestionDto> dtoQList = _db.Questions.Where(x => (x.Title.Contains(temp) || x.Message.Contains(temp) || (x.User.FirstName + " " + x.User.LastName).Contains(temp) || x.User.LastName.Contains(temp)) && (categoryId == null || x.Category.CategoryId == categoryId)) 
     .Select(question => new QuestionDto 
     { 
      QuestionId = question.QuestionId, 
      Votes = question.Votes, 
      Title = question.Title, 
      Message = question.Message, 
      CategoryName = question.Category.Name, 
      EditDate = question.EditDate, 
      DateOfCreation = question.DateOfCreation, 
      User = new UserDto { UserId = question.User.Id, FirstName = question.User.FirstName, LastName = question.User.LastName, ImageFile = question.User.ImageFile }, 
      Tags = question.Tags.Select(x => x.Tag).ToList() 
     }).ToList(); 

     var questionDictionaryMatchings = new Dictionary<int, int>(); 

     foreach(var question in dtoQList) 
     { 
      var titleSplited = question.Title.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries); 

      var messageSplited = question.Message.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries); 

      var firstNameSplited = question.User.FirstName.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries); 

      var lastNameSplited = question.User.LastName.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries); 


      var titleSplitedQuery = from word in titleSplited 
          where word.ToLowerInvariant() == temp.ToLowerInvariant() 
          select word; 

      int wordCountTitle = titleSplitedQuery.Count(); 

      var messageSplitedQuery = from word in messageSplited 
             where word.ToLowerInvariant() == temp.ToLowerInvariant() 
            select word; 

      int wordCountMessage = messageSplitedQuery.Count(); 


      var firstNameSplitedQuery = from word in firstNameSplited 
            where word.ToLowerInvariant() == temp.ToLowerInvariant() 
            select word; 

      int wordCountFirstName = firstNameSplitedQuery.Count(); 

      var lastNameSplitedQuery = from word in lastNameSplited 
            where word.ToLowerInvariant() == temp.ToLowerInvariant() 
            select word; 

      int wordCountLastName = lastNameSplitedQuery.Count(); 

      questionDictionaryMatchings.Add(question.QuestionId, wordCountTitle + wordCountMessage + wordCountFirstName + wordCountLastName); 

     } 
      //sorted dictionary 
      var questionDictionaryMatchingsSorted = from entry in questionDictionaryMatchings orderby entry.Value descending select entry; 
関連する問題