2009-08-28 6 views
1

인덱스를 잠그지 않고 읽기 전용 모드로 열 수 있도록 IndexSearcher를 어떻게 사용할 수 있습니까?Lucene.NET readonly IndexSearcher

는 지금은 그냥 읽기 전용 모드로 그 구멍을 읽고있다

var searcher = new IndexSearcher(LuceneIndexPath); 

그래서 난 그것에 대해 이동하는 방법에 대해 궁금 해서요 성능 향상이있다. 이 주제에 대한 많은 문서를 찾을 수 없었습니다.

답변

11

그게 전부라면 성능에 대해 나중에 걱정해야합니다. 여기에 몇 가지 팁은 인덱스 권한 하구에 의지하기 전에 루씬으로 가야됩니다

  • 루씬은 하지 데이터베이스입니다; 그것은 색인입니다. 인덱스되지 않은 것 이외의 모든 필드는 매우 효과적인 방법으로 최소화됩니다. 검색이 수행되면 데이터의 고유 해시와 일치하도록 쿼리가 최소화됩니다. 검색을 위해 저장하지 않는 것은 DB에서 정보를 복구하는 데 사용해야합니다. 이렇게하면 인덱스 크기 (따라서 검색 속도)를 한 단계 낮출 수 있습니다.
  • 줄기 모두 -은 텍스트의 단어 길이를 줄이려면 Porter Stemmer과 같은 단순한 형태로도 somethign을 사용하십시오. 당신이 질의를 할 때, 그것을 줄여라. 인덱스의 크기와 쿼리 속도에 미치는 영향은 적지 만 검색의 견고성 또한 향상됩니다.
  • Stopwords? 누가 필요합니까? 진지하게도 불쾌감을주는 좋은 목록을 찾아 색인 생성을 계획중인 모든 분야에서 삭제하십시오. 어떤 영어 텍스트에서나 찾을 수있는 가장 자주 나오는 용어는 정보 검색과 관련하여 절대적으로 쓸모가 없습니다. 즉, 데이터베이스를 저장하는 경우 데이터베이스가 불필요하게 커질 수 있습니다. 보도에 쓰여진 똑같은 크기의 편지를 걷는 것을 상상해보십시오. "좋은, 나쁜, 그리고 추악한"이 "좋았어, 나쁜, 추악한"과 비교하면 얼마나 걸릴까요?

이러한 세 가지 주요 측면이 먼저 다루어지고 성능에 대해 걱정할 필요가 없을 것입니다. 이러한 문제가 해결되기 전에 성능에 대해 걱정하는 것은 악명 높은 "시기상조의 최적화"중 하나입니다.

4

나는 최근에 이것에 대해 읽고 최단 시간 오픈 독자를 떠나 읽기 전용 패션에 indexsearcher을 사용하려면이 방법을 함께했다 :

private T searchIndex<T>(Func<IndexSearcher, T> searchAction) 
{ 
    var indexReader = IndexReader.Open(_indexDirectory, true); 
    var indexSearcher = new IndexSearcher(indexReader); 

    var result = searchAction(indexSearcher); 

    indexSearcher.Close(); 
    indexReader.Close(); 

    return result; 
} 

코드를 소모하는 것은이

var hits = searchIndex(s=> { 
    var query = _queryParser.Parse(searchString); 
    return indexSearcher.Search(query); 
}); 
과 같이 보입니다