2014-07-05 5 views
1

Lucene.Net을 사용하여 사용자 정의 검색 엔진을 작성하려고합니다.조회수를 최적화하는 방법 Lucene.Net의 객체 루핑

모두 잘 될 것 같지만 검색 기능에 의해 반환 된 조회수 개체를 반복하는 동안 문제가 발생합니다. 항목을 검색 할 때마다 Search Function의 경우 약 0.07 초, 반환 된 객체로 반복 할 때는 20 ~ 90 초가 소요됩니다.

예 : (총 11384 개의 결과가 반환되었습니다)
검색에 소요 된 시간은 0.068 초입니다.
개체 루핑은 25.50 초가 걸렸습니다. 이제

두 번째 시간 I 루프는 상기와 동일한 경우에 (훨씬 적은 시간이 소요이 같은 객체

그것은 0.141 초 걸렸습니다 여기

이 검색 기능은 다음과 같습니다.

public List<SearchResultId> SearchId(string searchTerm) 
    { 
     IndexSearcher indexSearcher = new IndexSearcher(_indexDir); 
     List<SearchResultId> searchList = new List<SearchResultId>(); 

     try 
     { 
      QueryParser queryParser = new QueryParser(_fieldName, new StandardAnalyzer()); 

      Query query = queryParser.Parse(searchTerm); 
      Hits hits = indexSearcher.Search(query); 
      int numHits = hits.Length(); 
      SearchResultId search; 
      for (int i = 0; i < numHits; ++i) 
      { 
       search = new SearchResultId(); 
       search.score = hits.Score(i); 
       search.id = hits.Doc(i).Get(LuceneIndexer.DOC_ID_FIELD_NAME); 
       searchList.Add(search); 
      } 
     } 
     catch 
     { 
      indexSearcher.Close(); 
     } 
     indexSearcher.Close(); 
     return searchList; 
    } 

일이 정상입니까 ?이 프로세스를 최적화하는 방법이 있나요?

감사

답변

1

두 번째 쿼리는 항상 빠른 때문에 캐싱이기 때문에 그것은 정상입니다. 많이 있습니다 최적화에 도움이되는 유용한 팁을 here에 있습니다. 나에게 가장 도움이

것들은했다 :

  1. 당신이 루씬의 최신 버전을 사용하고 있는지 확인합니다.
  2. 로컬 파일 시스템을 사용하십시오.
  3. readOnly = true로 IndexReader를 엽니 다.
  4. Windows가 아닌 플랫폼에서 FSDirectory 대신 NIOFSDirectory를 사용합니다.
  5. IndexSearcher 인스턴스 하나를 사용하십시오.