さらに別の潜在的に恥ずかしい質問。見落とされている可能性のある明らかな解決策を自由に指摘してください。私は以前に解決策を検索しましたが、何も見つかりませんでしたが、検索するキーワードを間違って選択することが問題になる場合があります。
状況は次のとおりです。solrコアに対して行われるすべてのクエリで追加のフィルターとしていくつかの必要なセキュリティパラメーターを挿入するために、エンタープライズyシステム用に数か月前に自分のRequestHandlerをコーディングしました。インデックスへのクエリの結果であるドキュメントが収集されてユーザーに返されるまで、すべてがスムーズに実行されます。
基本的に、フィルターが作成されてクエリが実行された後、ドキュメントID(およびスコア)のセットを取得しますが、結果セットを構築するためにIDを反復処理する必要があります。これは、一度に1つのヒットです。これは良いことです。標準のrequesthandlerのクエリよりも10倍遅く、結果の数が増えるにつれて悪化するだけです。さらに悪いことに、スキーマは柔軟性のために動的フィールドに大きく依存しているため、ドキュメントごとに取得するフィールドのリストを以前に取得する方法は、ドキュメントごとに可能なすべての組み合わせをテストする以外にありません。
以下のコードは、SolrIndexSearcherにクエリを実行し、応答を作成するために、本番環境で実行されているコードの簡略版です。
さらに苦労することなく、私の質問は次のとおりです。
- ドキュメントごとに応答ドキュメントを作成する代わりに、すべての結果を一度に取得する方法はありますか?
- 考えられるすべての組み合わせをテストする代わりに、各結果のフィールドのリストを取得する可能性はありますか?
- このコードで知っておくべき特定のWTFはありますか?気軽に蹴ってください!
//function that queries index and handles results
private void searchCore(SolrIndexSearcher searcher, Query query,
Filter filter, int num, SolrDocumentList results) {
//Executes the query
TopDocs col = searcher.search(query,filter, num);
//results
ScoreDoc[] docs = col.scoreDocs;
//iterate & build documents
for (ScoreDoc hit : docs) {
Document doc = reader.document(hit.doc);
SolrDocument sdoc = new SolrDocument();
for(Object f : doc.getFields()) {
Field fd = ((Field) f);
//strings
if (fd.isStored() && (fd.stringValue() != null))
sdoc.addField(fd.name(), fd.stringValue());
else if(fd.isStored()) {
//Dynamic Longs
if (fd.name().matches(".*_l") ) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
long testLong = a.getLong(0);
sdoc.addField(fd.name(), testLong );
}
//Dynamic Dates
else if(fd.name().matches(".*_dt")) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
Date dt = new Date(a.getLong());
sdoc.addField(fd.name(), dt );
}
//...
}
}
results.add(sdoc);
}
}