[ http://issues.apache.org/jira/browse/LUCENE-586?page=all ]
     
Yonik Seeley resolved LUCENE-586:
---------------------------------

    Fix Version: 2.1
     Resolution: Fixed
      Assign To: Yonik Seeley

Thanks Andrew, I just committed this.

> Very inefficient implementation of MultiTermDocs.skipTo
> -------------------------------------------------------
>
>          Key: LUCENE-586
>          URL: http://issues.apache.org/jira/browse/LUCENE-586
>      Project: Lucene - Java
>         Type: Improvement

>   Components: Index, Search
>     Reporter: Andrew Hudson
>     Assignee: Yonik Seeley
>      Fix For: 2.1

>
> In our application anytime the index was unoptimized/contained more than one 
> segment there was a sharp drop in performance, which amounted to over 50ms 
> per search on average.  We would consistently see this drop anytime an index 
> went from an optimized state to an unoptimized state.
> I tracked down the issue to the implementation of MultiTermDocs.skipTo 
> function (found in MultiReader.java).  Optimized indexes do not use this 
> class during search but unoptimized indexes do.  The comment on this function 
> even explicitly states 'As yet unoptimized implementation.'  It was 
> implemented just by calling 'next' over and over so even if it knew it could 
> skip ahead hundreds of thousands of hits it would not.
> So I re-implemented the function very similar to how the MultiTermDocs.next 
> function was implemented and tested it out on or application for correctness 
> and performance and it passed all our tests and the performance penalty of 
> having multiple segments vanished.  We have already put the new jar onto our 
> production machines.
> Here is my implementation of skipTo, which closely mirrors the accepted 
> implementation of 'next', please feel free to test it and commit it.
>   /** Much more optimized implementation. Could be
>    * optimized fairly easily to skip entire segments */
>   public boolean skipTo(int target) throws IOException {
>     if (current != null && current.skipTo(target-base)) {
>       return true;
>     } else if (pointer < readers.length) {
>       base = starts[pointer];
>       current = termDocs(pointer++);
>       return skipTo(target);
>     } else
>       return false;
>   }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to