2013-05-21 1 views
2

나는 상당히 큰 lucene 인덱스와 약 5000 개의 문서를 치는 쿼리를 가지고 있습니다. 응용 프로그램 메타 데이터를 lucene의 필드 (텍스트 내용 제외)에 저장하고 있으므로이 5000 개의 모든 히트에 대해이 작은 메타 데이터 필드에 빨리 도달해야합니다. searcher.doc를 호출 할 때마다()가 꽤 고가이기 때문에Lucene의 모든 쿼리 히트 필드를 효율적으로 반환

MapFieldSelector field = new MapFieldSelector("metaData"); 
ScoreDoc[] hits = searcher.search(query, null, 10000).scoreDocs; 
for (int i = 0; i < hits.length; i++) { 
    int index_doc_id = hits[i].doc; 
    Document hitDoc = searcher.doc(index_doc_id, field); // expensive esp with disk-based lucene index 
    metadata = hitDoc.getFieldable("metaData").stringValue(); 
} 

그러나,이 몹시 느린 : 현재, 내 코드는 다음과 같이 보인다. 더 많은 반응을 낼 수있는 모든 조회수에 대해 필드의 '일괄'가져 오기를 수행하는 방법이 있습니까? 또는이 작업을 더 빨리 수행 할 수있는 다른 방법이 있습니까? (ScoreDoc 안의 유일한 것은 Lucene doc id인데, 나는 의존해서는 안된다. 그렇지 않으면 Lucene doc id -> metadata map을 스스로 유지했을 것이다.) 고마워! 지금 FieldCache의는 다음과 같이 사용하는 것을 시도하고있다 :

업데이트

String metadatas[] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings(searcher.getIndexReader(), "metaData"); 

내가하고 쿼리시 인덱스 열 때 : 이것은 나를 위해 잘 작동

int ldocId = hits[i].doc; 
String metadata = metadatas[ldocId]; 

합니다.

+0

안녕하세요, similary 문제가 있지만, lucene4.5.1에서 fieldcache.default.getStrings을 사용할 수 없으므로 다른 유사한 방법을 알고 계십니까? – ikel

답변

1

성능을 향상 시키려면 가능한 한 많이 저장된 데이터를 줄이는 것이 가장 좋습니다. 인덱스에 저장된 대형 컨텐트 필드가있는 경우 인덱스 된 값만 저장되도록 설정하면 성능이 향상됩니다. 조회수가 색인에서 발견 된 후 가져올 수있는 Lucene 외부의 콘텐츠를 저장하는 것이 더 좋은 아이디어입니다.

찾고있는 최종 결과에 도달하는 더 좋은 방법이 존재할 수도 있습니다. 나는 5000 세트의 메타 데이터가 여기에 최종 결과가 아닐 것으로 추측하고있다. Lucene의 색인 된 데이터에 대한 분석은 색인에서 먼저 꺼내는 대신 더 쉽게 처리 할 수 ​​있습니다. 당신이 제공 한 것에 근거하여, 귀하의 경우 가능한지, 그러나 확실히 볼만한 가치가 있을지는 모르겠습니다.

+0

String metadata [] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings (searcher.getIndexReader(), "metaData"); – user1001630

+0

여기서 무엇을 말하려고하는지 잘 모르겠습니다. 메타 데이터 필드에 모든 값을 가져 오시겠습니까? – femtoRgon

관련 문제