나는 상당히 큰 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];
합니다.
안녕하세요, similary 문제가 있지만, lucene4.5.1에서 fieldcache.default.getStrings을 사용할 수 없으므로 다른 유사한 방법을 알고 계십니까? – ikel