I am using RankQuery to implement my applicative scorer that returns a score
based on the value of specific field (lets call it 'score_field') that is
stored for every document.
The RankQuery creates a collector, and for every collected docId I retrieve
the value of score_field, calculate the score and add the doc id into
priority queue:

public class MyScorerrankQuet extends RankQuery { 
        ... 

        @Override 
        public TopDocsCollector getTopDocsCollector(int i,
SolrIndexerSearcher.QueryCommand cmd, IndexSearcher searcher) { 
                ... 
                return new MyCollector(...) 
        } 
} 

public class MyCollector  extends TopDocsCollector{         
        MyScorer scorer; 
        SortedDocValues scoreFieldValues;       //Initialized in constrctor

        public MyCollector(){ 
                scorer = new MyScorer(); 
                scorer.start(); //the scorer's API needs to call start()
before every query and close() at the end of the query
                                AtomicReader r =
SlowCompositeReaderWrapper.wrap(searcher.getIndexReader());
                scoreFieldValues = DocValues.getSorted(r, "score_field");       
/*
THIS CALL IS TIME CONSUMING! */
        } 

        @Override 
        public void collect(int id){ 
                        int docID = docBase + id;
                //1. get specific field from the doc using DocValues and
calculate score using my scorer 
                String value = scoreFieldValues.get(docID).utf8ToString();
                scorer.calcScore(value);
                //2. add docId and score (ScoreDoc object) into
PriorityQueue. 
        } 
} 


I used DocValues to get the value of score_field. Currently its being
instantiate in collector's constructor - which is performance killer,
because it is being called for EVERY query, even if the index is static (no
commits). I want to make the DocValue.getStored() call only when it is
really necessary, but I dont know where to put that code. Is there a place
to plug that code so when a new searcher is being opened I can add my this
applicative cache?



--
View this message in context: 
http://lucene.472066.n3.nabble.com/Adding-applicative-cache-to-SolrSearcher-tp4211012.html
Sent from the Solr - User mailing list archive at Nabble.com.

Reply via email to