2017-10-21 5 views
2

하나의 색인으로 Lucene.Net 기반 검색 엔진 응용 프로그램을 C#으로 만듭니다. 요구 사항으로는 여러 (5) 개의 쿼리로 테스트 실행을 위해 런타임을 최적화해야합니다. 따라서 검색 할 때마다 별도의 스레드를 사용하여 this 게시물과 비슷한 결과를 반환하고 싶습니다. 내 코드는 다음과 같습니다Lucene.Net Parallel Search

// load information needs 
List<InformationNeed> informationNeeds = FileReader.readInformationNeeds(collectionPath);    

// each search has its own thread referenced in this list 
List<Thread> threadList = new List<Thread>(); 

// each search has its own result referenced in this list 
List<SearchResult> searchResults = new List<SearchResult>(); 


foreach (InformationNeed informationNeed in informationNeeds){ 

    // create searchOptions 
    SearchOptions searchOptions = new SearchOptions(DEBUG_pre_processQuery, informationNeed.getInput()); 

    // run search 
    SearchResult result = null; // Used to store the return value 
    var thread = new Thread(
     () => 
     { 
     result = startSearch(searchOptions); 
     Console.WriteLine("end search for IN nr " + informationNeed.getID() + "results = " + result); 

     //add results to list 
     searchResults.Add(result); 

     }); 
    thread.Start(); 
    threadList.Add(thread); 
} 

// block main thread until all threads finished 
foreach (Thread t in threadList){ 
    t.Join(); 
} 

return searchResults; 

을하지만, 내가 순차적으로 검색을 실행할 때 내가되지 않는 Lucene.Net.QueryParser.ParseException see screenshot을 얻고있다.

내가 무엇인가 불분명하게한다면 의견을 말하십시오. 이 문제에 대한 도움을 주시면 감사하겠습니다.

+0

'searchResults'에 대한 액세스를 동기화하지 않습니다. 그것은 문제를 일으킬 것입니다. –

답변

2

searchResults에 대한 액세스를 동기화해야하거나 여러 스레드가 동시에 수정해야합니다. 또는 비동기 패턴을 사용하여 비동기 메서드에서 Task<SearchResult>을 반환하고 모든 스레드에 동일한 List을 사용하지 않을 수 있습니다.

또한 스레드 외부에 SearchResult result을 선언하면 searchResults이 문제를 일으키는 것과 같은 방식으로 문제를 묻는 중입니다. 스레드 안에 선언하십시오.

1

해결되었습니다. startSearch 메서드에서 설명한 here 같이 threadsafe 아닌 QueryParser 호출이 있습니다. lockQueryParser 인스턴스에 추가하여이 문제를 해결했습니다.

+0

'searchResults'에 대한 비 스레드 접근을 수정 했습니까? –

+0

예 저는 거기에'lock '을 넣습니다. 고맙습니다! – pad