2009-10-03 5 views
2

내 ASP.NET MVC (C#, Linq-to-Sql) 웹 사이트에서 완전한 검색 기능을 구현하려고합니다.검색 데이터베이스 - ASP.NET MVC C#

사이트는 검색하려는 약 1-2 개의 열이있는 약 3-4 개의 표로 구성됩니다.

이것은 내가 지금까지 무엇을 가지고 : 당신이 볼 수 있듯이

public List<SearchResult> Search(string Keywords) 
    { 
     string[] split = Keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
     List<SearchResult> ret = new List<SearchResult>(); 
     foreach (string s in split) 
     { 
      IEnumerable<BlogPost> results = db.BlogPosts.Where(x => x.Text.Contains(s) || x.Title.Contains(s)); 

      foreach (BlogPost p in results) 
      { 
       if (ret.Exists(x => x.PostID == p.PostID)) 
        continue; 

       ret.Add(new SearchResult 
       { 
        PostTitle= p.Title, 
        BlogPostID = p.BlogPostID, 
        Text=p.Text 
       }); 

      } 
     } 
     return ret; 
    } 

, 나는 키워드와 테이블을 통해 실행 내부 foreach는 대한 foreach 문이 (나는 각 테이블에 대해 그것을 반복 것이다).

이것은 비효율적 인 것 같아서 데이터베이스 검색 방법을 만드는 더 좋은 방법인지 알고 싶었습니다.

더 빨리 검색 할 수 있도록 데이터베이스의 열을 어떻게 할 수 있습니까? 인덱싱에 대해 읽은 내용은 SQL Management Studio에서 볼 수있는 "전체 텍스트 인덱싱"True/False 필드입니까?

답변

6

, 나는 데이터베이스에 컬럼에 무엇을 할 수 있습니까? 나는 그들에게 색인을 붙이는 것에 관해 를 읽었다. 단지 "전체 텍스트 색인"사실/틀린 필드 SQL Management Studio에서 볼 수 있겠습니까?

예, 전체 텍스트 인덱싱을 사용하면 일반적으로이 시나리오의 성능이 향상됩니다. 그러나 불행하게도 LIKE 연산자로 자동으로 작동하지 않습니다 (LINQ 쿼리가 생성하는 것입니다). 따라서 FREETEXT, FREETEXTTABLE, CONTAINS 또는 CONTAINSTABLE과 같은 내장 된 전체 텍스트 검색 기능 중 하나를 사용해야합니다.

설명하기 만하면 테이블 스캔이 일반적으로 발생하므로 원래 코드는 전체 텍스트 검색보다 상당히 느립니다. 예를 들어 LIKE '% ABC %'라는 제목의 varchar 필드를 검색하는 경우 SQL에 모든 문자를 스캔하여 해당 문자가 포함되어 있는지 확인해야합니다.

그러나 기본 제공 전체 텍스트 검색은 실제로 전체 텍스트 인덱스에 포함되도록 지정한 모든 열의 텍스트를 인덱싱합니다. 그리고 쿼리 속도를 대폭 향상시키는 것은 바로 인덱스입니다.

뿐만 아니라 전체 텍스트 검색은 LIKE 연산자가 제공 할 수없는 몇 가지 유용한 기능을 제공합니다. Google만큼 정교하지는 않지만 근원 단어의 대체 버전을 검색 할 수 있습니다. 하지만 내가 좋아하는 기능 중 하나는 결과를 정렬하는 데 사용할 수있는 관련성을 나타내는 추가 값을 반환 할 수있는 순위 지정 기능입니다. 그 모양을 FREETEXTTABLE 또는 CONTAINSTABLE 기능에 사용하려면.

일부 더 많은 자원 :

0

다음 트릭을 수행해야합니다. kwa = ... 부분이 실제로 작동하는지 여부는 상관 없지만 SQL Server의 컨텍스트 내에서 사용할 수있는 키워드 배열을 만들려면 비슷한 것이 필요합니다. 나는 잠시 동안 LINQ를 SQL에 사용하지 않았다. (나는 LINQ를 Entities 4.0으로 사용하고 nHibernate를 사용하고 있으며, 다른 기능을 갖고있다.) 당신은이 작업을하려면 그 부분을 조정할해야 할 수도 있습니다,하지만 일반적인 교장은 소리 : 그들은 빠르게 검색 할 수 있도록

또한
public List<SearchResult> Search(string keywords) 
{  
    var searcResults = from bp in db.BlogPosts 
        let kwa = keywords.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries); 
        where kwa.Any(kw => bp.Text.Contains(kw) || bp.Title.Contains(kw)) 
        select new SearchResult 
        { 
         PostTitle = bp.Title, 
         BlogPostID = bp.BlogPostID, 
         Test = bp.Text 
        }; 

    return searchResults.ToList(); 
} 
관련 문제