lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Timo Nentwig <luc...@nitwit.de>
Subject Re: Caching FuzzyQuery
Date Sat, 06 Sep 2008 18:55:38 GMT


On Tue, 11 Dec 2007, Timo Nentwig wrote:

> Date: Tue, 11 Dec 2007 13:27:59 +0100
> From: Timo Nentwig <lucene@nitwit.de>
> Reply-To: java-dev@lucene.apache.org
> To: java-dev@lucene.apache.org
> Subject: Caching FuzzyQuery
> 
> Hi!
>
> Actually FuzzyQuery.rewrite() is pretty expensive so why not introduce a
> caching decorator? A WeakHashMap with key==IndexReader and value==LRU of
> BooleanQueries.

So, didn't become a popular approach/topic. Anyway, I wrote an aspect and 
it does the job for a couple of months now, so I'd like to share it.

HTH
Timo


In order to enable runtime AspectJ weaving start your JVM with

    -javaagent:./foo/bar/lib/aspectjweaver.jar

and place the following file called "aop.xml" in META-INF.

<aspectj>
         <aspects>
                 <aspect name="foo.bar.FuzzyQueryCachingAspect" />
         </aspects>

         <weaver options="-verbose -showWeaveInfo">
                 <include within="org.apache.lucene.search.*" />
                 <include within="org.apache.lucene.index.*" />
         </weaver>
</aspectj>


@Aspect
public class FuzzyQueryCachingAspect
{
         private static final Log LOG = LogFactory.getLog( 
FuzzyQueryCachingAspect.class );
         // your cache impl goes here
         private static final Caching CACHE = Caching.instance( 
Caching.FUZZY );

         @Before( "execution(public void 
org.apache.lucene.index.IndexReader+.close())" )
         public void flush( final JoinPoint jp ) throws Throwable
         {
                 assert jp.getThis() == jp.getTarget();

                 final IndexReader r = (IndexReader)jp.getThis();
                 final Directory d = r.directory();

                 final String group = name( d );

                 CACHE.remove( group );
                 LOG.info( "Removed from " + CACHE + ": " + group );
         }

         @Around( "execution(public org.apache.lucene.search.Query
org.apache.lucene.search.FuzzyQuery.rewrite(org.apache.lucene.index.IndexReader)) 
&& args(reader)" )
         public Object cache( final IndexReader reader, final 
ProceedingJoinPoint jp ) throws Throwable
         {
                 assert jp.getThis() == jp.getTarget();

                 final FuzzyQuery q = (FuzzyQuery)jp.getThis();
                 final String term = q.getTerm().text();

                 final String group = name( reader.directory() );
                 final String key = term + "~" + q.getMinSimilarity();

                 final Object e = CACHE.get( group, key );
                 if( e != null )
                 {
                         LOG.debug( term + " found in cache" );
                         return e;
                 }

                 final long t0 = System.currentTimeMillis();
                 final Query fuzzy = (Query)jp.proceed();
                 CACHE.put( group, key, fuzzy );
                 LOG.info( term + " rewritten in " + 
(System.currentTimeMillis() - t0) + "ms (" + group + ")" );

                 return fuzzy;
         }

         private static final String name( final Directory d )
         {
                 if( d instanceof FSDirectory ) return 
((FSDirectory)d).getFile().getAbsolutePath();

                 return String.valueOf( d.hashCode() );
         }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org


Mime
View raw message