0

さらに別の潜在的に恥ずかしい質問。見落とされている可能性のある明らかな解決策を自由に指摘してください。私は以前に解決策を検索しましたが、何も見つかりませんでしたが、検索するキーワードを間違って選択することが問題になる場合があります。
状況は次のとおりです。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);
    }
}  

4

1 に答える 1

0

OPリクエストごと:

これはあなたの特定の質問に答えるものではありませんが、私はあなたの問題を解決するための別のオプションを提案します。

すべてのクエリにフィルターを追加するには、SolrConfig.xmlファイルのStandardRequestHandlerに「追加」セクションを追加します。「fl」(フィルターの略)セクションを追加し、フィルターを追加します。StandardRequestHandlerを介してパイプされるすべてのリクエストには、フィルターが自動的に追加されます。

このフィルターは他のフィルターと同じように扱われるため、FilterCacheにキャッシュされます。その結果、クエリ時に(docIdを介して)かなり高速にフィルタリングされます。これにより、フィルタリング基準を適用するためにソリューション内の個々のドキュメントをプルする必要がなくなる場合があります。

于 2011-12-13T23:43:17.253 に答える