2013-08-30 5 views
1

나는 웹 사이트에서 어떻게 고급 검색 기능을 만들 수 있는지 알아 내려고하고있다. 지금 사용하고있는 코드는 효율적이지 않고 매우 비싼 쿼리를 만듭니다.고급 검색 창 만들기

내 검색 컨트롤러 : 당신은 텍스트 검색을 많이 할하려는 경우

public ActionResult Index(string q = null, string authors = null, string category = null, decimal rating = 0, string published = null, int completed = 0, int page = 0) 
     { 
      List<string> categories = new List<string>(); 
      List<string> authorss = new List<string>(); 
      DateTime DateBy = new DateTime(); 
      DateTime.TryParse(published, out DateBy); 

      if(!string.IsNullOrEmpty(authors)) 
       authorss = authors.Split(',').ToList(); 
      if (!string.IsNullOrEmpty(category)) 
       categories = category.Split(',').ToList(); 


      IEnumerable<Comic> Comics = db.Comics.Where(i => i.Title.Contains(q)).Include(i => i.ComicRatings).Include(i => i.ComicAuthors).Include("ComicAuthors.User"); 

      if(authorss.Count() >= 1) 
      { 
       Comics = Comics.Where(i => i.ComicAuthors.Where(j => authorss.Contains(j.User.UserName)).GroupBy(j => j.Comic_Id).Where(j => j.Count() >= authorss.Count()).Any()); 
      } 

      if (categories.Count() >= 1) 
      { 
       Comics = Comics.Where(i => i.ComicCategories.Where(j => categories.Contains(j.Category.Name)).GroupBy(j => j.Comic_Id).Where(j => j.Count() >= categories.Count()).Any()); 
      } 

      if (rating != 0) 
      { 
       Comics = Comics.Where(i => i.ComicRatings.Where(j => j.Rating >= rating).Any()); 
      } 

      if (completed == 1) 
      { 
       Comics = Comics.Where(i => i.Completed == false); 
      } 
      else if (completed == 2) 
      { 
       Comics = Comics.Where(i => i.Completed == true); 
      } 

      if (!string.IsNullOrEmpty(published)) 
      { 
       Comics = Comics.Where(i => i.DatePublished >= DateBy); 
      } 

      if(page <= (Comics.Count()/20)) 
       page = 0; 

      Comics = Comics.Skip(page * 20).Take(20); 

      IEnumerable<LocalComicCategoriesModel> testing = helper.getCategories(); 
      ViewSearchModel post = new ViewSearchModel 
      { 
       Comic = Comics.ToList(), 
       Categories = testing 
      }; 

      return View(post); 
     } 

답변

1

내가 루씬을 살펴 것입니다 무슨 일이 이런 식으로 뭔가를 만드는 방법에 대한 좋은 자원/예가 될 것이다 .Net Lucene은 비 관계형 전체 텍스트 검색 엔진으로, 많은 장소에서 사용됩니다.

우리는 SQL과 linq에서 모든 것을 버리고 완전히 전용 검색 시스템을 사용하기 전에 텍스트 검색을 시도했습니다.

+0

나는이 대답을 반향 것입니다 ... 당신이 구축을 위해 노력하지 않더라도 " avanced 검색 ", 나는 Lucene을 사용합니다. –

+0

Lucene을 Entity와 함께 사용하는 좋은 지침서는 어디 있습니까? –

+0

Entity와 데이터베이스를 통합하는 방법을 모르겠습니다. –

0

당신의 주된 문제는 당신이 너무 많은 만화를 검색하고 그들을 걸러 내고 있다는 사실에서 비롯된 것이라고 생각합니다. 나는 첫 번째 단계로서 데이터베이스에서 검색하는 만화의 수를 제한하려고 노력할 것이다. 이렇게하려면 실제로 끝내기까지 (예 : 호출 끝에서 Any()를 사용하는 것처럼) 실제로 실행하지 않고 쿼리를 한 번에 하나씩 작성하거나 조건부를 사용하여 쿼리를 작성하십시오 빌더. 그들은 모두를 제공 할 수 이러한 두 가지 질문에서보세요이 필요합니다

Creating dynamic queries with entity framework

Building dynamic where clauses in LINQ to EF queries