2016-06-29 3 views
0

Lucene.Net을 사용하여 C#에서 검색/찾아보기 응용 프로그램의 프로토 타입을 만들었습니다. 소스 데이터는 Lucene을 사용하여 인덱스하는 약 5MB의 단일 XML 파일 (약 900 개의 "문서"포함)입니다. 내 검색은 정상적으로 작동하며 충분히 빠릅니다. 이 응용 프로그램의 경우 각 "히트"문서를 탐색하고 보는 것이 중요하므로 사용자는 히트를 선택하고 해당 문서의 전체보기를 볼 수 있습니다 (일반적으로 화면의 반쪽에 맞음). 일치하는 검색어가 필요합니다. 전망. WPF 및 MVVM 접근 방식을 사용하고 있습니다. 문서보기에는 현재 약 12 ​​개의 ContentControls가 구현되어 있으며이 중 6 개는 highlightConverter를 사용하는 검색 가능한 필드를 표시하기위한 것입니다.Lucene Highlighter 작업의 성능을 향상 시키려면 어떻게합니까?

성능이 매우 좋지 않아 문제를 분리하기 위해 스톱워치 타이밍을 추가했습니다. 내 모델의 HighlightSearchTerms 메서드는 범인 (약 100-600 ms 실행) 인 것 같습니다. 이 메서드를 단락시켜 입력 텍스트를 반환하면 성능이 좋습니다.

_analyzer is a StandardAnalyzer(_luceneVersion) 
_parser is a QueryParser(_luceneVersion, “content”, _analyzer) 
_formatter is a SimpleHTMLFormatter(“|~S~|”, “|~E~|”); 

private string HighlightSearchTerms(string text, string queryString) 
{ 
    var query = new BooleanQuery(); 
    query.Add(_parser.Parse(queryString), Occur.SHOULD); 
    var fragmentScorer = new QueryScorer(query); 
    var highlighter = new Highlighter(_formatter, fragmentScorer); 
    highlighter.TextFragmenter = new NullFragmenter(); 
    var tokenStream = _analyzer.TokenStream(null, new StringReader(text)); 
    string highlightedText = highlighter.GetBestFragment(tokenStream, text); 
    return highlightedText == null ? text : highlightedText; 
} 

몇 년 전에 나는 "루씬 액션에서"책을 읽고 다시 내가 어떤 아이디어를 얻을 수 있는지 확인하기 위해 관련 부분을 통해 손때있다 : 여기

는 방법이다. 나는 또한 좋은 그물을 수색했다. 그래서, 여기에 몇 가지 질문이나 가능한 탐험 분야가 있습니다.

  1. 어떻게 든 점수를 생략 할 수 있습니까? 검색어와 일치하는 문맥을 표시 할 필요가 없으므로 적중 문서를 조각으로 분해하고 다양한 조각에 대한 "점수"를 얻을 필요가 없습니다. 히트 목록을 제목으로 표시하고 사용자가 한 번의 히트를 선택하면 전체 히트 문서가 강조 표시되어 표시됩니다. 나는 NullFragmenter와 GetBestFragment를 사용하는 방법을 보지만, 그 이 채점 연산을 단락시키는 지 여부를 알지 못합니다. 채점을 생략하면 성능이 향상됩니까?
  2. refactoring 내보기로 에 대한 하나의 위젯이 HTML 또는 RTF 텍스트 중 하나의 blob로 히트 문서를 표시하는 것으로 간주했습니다. 그런 식으로 강조 표시 메서드를 10 또는 15 대신에 한 번만 호출 할 수 있습니다. 번 (일부 ContentControls는 ItemsControl 내에 있으므로보기에 일부 필드가 여러 개있는 인스턴스가 있습니다). 나는 이것을 통해 성능이 크게 향상 될 것으로 기대합니다. 강조 표시는 테이블 서식과 그와 같은 것으로 마크 업된 텍스트 에있을 것입니다. 그러나 나는 여전히 작동 할 것이라고 을 가정합니까?
  3. 강조 표시 방법을 잃어 버리는 다른 것이 있습니까? 너무 느린가요? 1 초반은 너무 느린 것처럼 보입니다 - 나는 정말 기본적인 것을 엉망으로 만들고 있습니다.
+0

옵션 2를 진행했는데 정상적으로 작동합니다. 마크 업 된 HTML 문자열은 마크 업으로 인해 정확하게 강조 표시되지 않을 것이고 Lucene 문서는 형광펜에 전달 된 콘텐츠가 원래 색인 생성 된 콘텐츠와 정확하게 일치해야한다고 강조했기 때문에 두려워했습니다. 그러나 나는 그 문서들이 귀하의 색인이 최신인지를 확인하기위한 알림 일 뿐이라고 생각합니다. 나는 이것이 해결책이 아닌 해결 방법이라고 생각하기 때문에 질문을 계속 열어 둘 것입니다. –

답변

0

이미 here에 주어진 답변에 따라 추가 개선점을 얻을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 이것을 더 깊이 조사 할 것이다. 실제로 전에이 게시물을 보았지만 WITH_POSITIONS_OFFSETS을 (를) 추가하려고 시도했지만 많이 개선되지 않았습니다.이제는 (옵션 2를 사용하여) 만족스러운 성능을 얻었으므로 몇 가지 속도 테스트를 수행하고 다양한 검색 및 강조 표시 작업에 대한이 설정의 효과를 확인하고자합니다. 강조하고있는 텍스트는 소스 문서의 다양한 필드에서 정보를 HTML로 집계 한 것이므로 위치와 오프셋이 의미가 있는지 궁금합니다. 나는 그것이 파고 들어 어떻게 작동하는지 이해해야 할 것이다. –

+0

좋아요, 개선 된 부분을 보시려면 지금 당장 저장된 위치와 오프셋이 없으므로 콘텐츠의 색인을 다시 생성해야합니다. – AR1

관련 문제