Unless you really need special cache behavior, can you use the LRUCache that comes with Solr? It will make your life easier using a well tested cache implementation. You can size it large enough so that items never get dropped if that's the issue.
You shouldn't really need to implement your own Listener either (while valid, it's a tougher approach). You could just send your plugin a message via the builtin QuerytSenderListener. <listener event="firstSearcher" class="solr.QuerySenderListener"> <arr name="queries"> <lst> <str name="q">fast_warm</str> <str name="start">0</str> <str name= "rows">10</str> </lst> </arr> </listener> If you do choose to implement your own listener, you need to register it, like above. Details on how your facet cache is supposed to work might help with answering future questions. -Yonik On 5/10/06, Erik Hatcher <[EMAIL PROTECTED]> wrote:
On May 10, 2006, at 3:01 PM, Yonik Seeley wrote: > On 5/10/06, Erik Hatcher <[EMAIL PROTECTED]> wrote: >> I've started down this route, but I'm not sure how to initialize my >> cache the first time. >> >> I need access to the IndexReader to build the cache, and at this >> point I don't need any incremental cache updates - if a new >> IndexSearcher is swapped in, I want to rebuild the cache. >> >> Should I combine a custom SolrCache with a newSearcher listener to >> have it generated right away? I put in a dummy cache and >> regenerator, but only see the cache .init() method being called, not >> the warm() method (on application server startup). How can I >> bootstrap it such that my cache gets built on app. startup? > > If your cache is populated as the result of any request to your > plugin, simply send a request via a firstSearcher hook. If it's not > populated for any request, then send a special request that your > plugin would recognize as a "populate cache" request. Sorry I'm being dense today, though I really do appreciate the incredibly fast response time you and Hoss have on this. My cache is not available in newSearcher() at startup time: public class CacheFacetsListener implements SolrEventListener { public void init(NamedList namedList) { } public void postCommit() { throw new UnsupportedOperationException(); } public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) { try { SolrCache cache = newSearcher.getCache("facet_cache"); if (cache == null) { System.out.println("!!!!! cache is null"); } cache.warm(newSearcher, null); } catch (IOException e) { log.severe(e.getMessage()); } } } I'm getting the "cache is null" message. Though the cache is created and init()'d as I see it's diagnostic output in Jetty's console before the NPE: public class FacetCache implements SolrCache { private Map facetCache; // key is field, and key to inner map is value private State state; private void loadFacets(IndexReader reader) throws IOException { System.out.println("Loading facets for " + reader.numDocs() + " documents ..."); // .... System.out.println("Done loading facets."); } public Object init(Map args, Object persistence, CacheRegenerator regenerator) { state=State.CREATED; System.out.println("<<<<< FacetCache.init >>>>>"); return persistence; } // ...... } And from solrconfig.xml: <cache name="facet_cache" class="org.nines.FacetCache" /> The console has this output: May 10, 2006 3:44:26 PM org.apache.solr.search.SolrIndexSearcher <init> INFO: Opening [EMAIL PROTECTED] main <<<<< FacetCache.init >>>>> May 10, 2006 3:44:26 PM org.apache.solr.core.SolrCore registerSearcher INFO: Registered new searcher [EMAIL PROTECTED] main !!!!! cache is null May 10, 2006 3:44:26 PM org.apache.solr.core.SolrException log SEVERE: java.lang.NullPointerException at org.nines.CacheFacetsListener.newSearcher (CacheFacetsListener.java:24) at org.apache.solr.core.SolrCore$2.call(SolrCore.java:427) I'm probably making this more difficult than it needs to be, but today I'm slow :) What am I doing wrong? Thanks, Erik