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;
}
몇 년 전에 나는 "루씬 액션에서"책을 읽고 다시 내가 어떤 아이디어를 얻을 수 있는지 확인하기 위해 관련 부분을 통해 손때있다 : 여기
는 방법이다. 나는 또한 좋은 그물을 수색했다. 그래서, 여기에 몇 가지 질문이나 가능한 탐험 분야가 있습니다.- 어떻게 든 점수를 생략 할 수 있습니까? 검색어와 일치하는 문맥을 표시 할 필요가 없으므로 적중 문서를 조각으로 분해하고 다양한 조각에 대한 "점수"를 얻을 필요가 없습니다. 히트 목록을 제목으로 표시하고 사용자가 한 번의 히트를 선택하면 전체 히트 문서가 강조 표시되어 표시됩니다. 나는 NullFragmenter와 GetBestFragment를 사용하는 방법을 보지만, 그 이 채점 연산을 단락시키는 지 여부를 알지 못합니다. 채점을 생략하면 성능이 향상됩니까?
- refactoring 내보기로 에 대한 하나의 위젯이 HTML 또는 RTF 텍스트 중 하나의 blob로 히트 문서를 표시하는 것으로 간주했습니다. 그런 식으로 강조 표시 메서드를 10 또는 15 대신에 한 번만 호출 할 수 있습니다. 번 (일부 ContentControls는 ItemsControl 내에 있으므로보기에 일부 필드가 여러 개있는 인스턴스가 있습니다). 나는 이것을 통해 성능이 크게 향상 될 것으로 기대합니다. 강조 표시는 테이블 서식과 그와 같은 것으로 마크 업된 텍스트 에있을 것입니다. 그러나 나는 여전히 작동 할 것이라고 을 가정합니까?
- 강조 표시 방법을 잃어 버리는 다른 것이 있습니까? 너무 느린가요? 1 초반은 너무 느린 것처럼 보입니다 - 나는 정말 기본적인 것을 엉망으로 만들고 있습니다.
옵션 2를 진행했는데 정상적으로 작동합니다. 마크 업 된 HTML 문자열은 마크 업으로 인해 정확하게 강조 표시되지 않을 것이고 Lucene 문서는 형광펜에 전달 된 콘텐츠가 원래 색인 생성 된 콘텐츠와 정확하게 일치해야한다고 강조했기 때문에 두려워했습니다. 그러나 나는 그 문서들이 귀하의 색인이 최신인지를 확인하기위한 알림 일 뿐이라고 생각합니다. 나는 이것이 해결책이 아닌 해결 방법이라고 생각하기 때문에 질문을 계속 열어 둘 것입니다. –