Since you are just interested in retrieving the top n hits, sounds to
me that TopDocs is the way to go.  It's not a drop-in replacement for
Hits but the transition is pretty straightforward.

Then if MatchAllDocsQuery + filters gives you good enough performance
you could stop, if it doesn't look at Boolean queries.

And of course do take note of the comments about sorting.

http://wiki.apache.org/lucene-java/ImproveSearchingSpeed is well worth a look.


--
Ian.


On Mon, Nov 30, 2009 at 4:34 PM, Michel Nadeau <aka...@gmail.com> wrote:
> I'll definitely switch to a Collector.
>
> It's just not clear for me if I should use BooleanQueries or
> MatchAllDocuments+Filters ?
>
> And should I write my own collector or the TopDocs one is perfect for me ?
>
> - Mike
> aka...@gmail.com
>
>
> On Mon, Nov 30, 2009 at 11:30 AM, Erick Erickson 
> <erickerick...@gmail.com>wrote:
>
>> The problem with hits is that a it re-executes the query
>> every N documents where N is 100 (?).
>>
>> So, a loop like
>> for (int idx : hits.length) {
>>   do something....
>> }
>>
>> Assuming my memory is right and it's every 100, your query will
>> re-execute (length/100) times. Which is unfortunate.
>>
>> The very quick test to see where to concentrate first would be to take
>> a time stamp just before you hit your loop.....
>>
>> This will tell you whether this loop is the culprit, but it really doesn't
>> matter because you'll follow the advice from Uwe and Shai anyway <G>.
>>
>> Filtering and Sorting are applied to Collectors before you see them.....
>>
>> The other bit would be to investigate your sorting. Remember that the
>> first sort or two take quite a while since the relevant caches are
>> populated with first used, so second+ queries should be faster. The
>> Wiki has some timing/speedup advice.....
>>
>> Best
>> Erick
>>
>>
>> On Mon, Nov 30, 2009 at 11:10 AM, Michel Nadeau <aka...@gmail.com> wrote:
>>
>> > What is the main difference between Hits and Collectors?
>> >
>> > - Mike
>> > aka...@gmail.com
>> >
>> >
>> > On Mon, Nov 30, 2009 at 11:03 AM, Uwe Schindler <u...@thetaphi.de> wrote:
>> >
>> > > And if you only have a filter and apply it to all documents, make a
>> > > ConstantScoreQuery on top of the filter:
>> > >
>> > > Query q=new ConstantScoreQuery(cluCF);
>> > >
>> > > Then remove the filter from your search method call and only execute
>> this
>> > > query.
>> > >
>> > > And if you iterate over all results never-ever use Hits! (its already
>> > > deprecated). Write a Collector instead (as you are not interested in
>> > > scoring).
>> > >
>> > > And: If you replace a relational database with Lucene, be sure not to
>> > think
>> > > in a relational sense with foreign keys / primary keys and so on. In
>> > > general
>> > > you should flatten everything.
>> > >
>> > > Uwe
>> > >
>> > > -----
>> > > Uwe Schindler
>> > > H.-H.-Meier-Allee 63, D-28213 Bremen
>> > > http://www.thetaphi.de
>> > > eMail: u...@thetaphi.de
>> > >
>> > >
>> > > > -----Original Message-----
>> > > > From: Shai Erera [mailto:ser...@gmail.com]
>> > > > Sent: Monday, November 30, 2009 4:56 PM
>> > > > To: java-user@lucene.apache.org
>> > > > Subject: Re: Performance problems with Lucene 2.9
>> > > >
>> > > > Hi
>> > > >
>> > > > First you can use MatchAllDocsQuery, which matches all documents. It
>> > will
>> > > > save a HUGE posting list (TAG:TAG), and performs much faster. For
>> > example
>> > > > TAG:TAG computes a score for each doc, even though you don't need it.
>> > > > MatchAllDocsQuery doesn't.
>> > > >
>> > > > Second, move away from Hits ! :) Use Collectors instead.
>> > > >
>> > > > If I understand the chain of filters, do you think you can code them
>> > with
>> > > > a
>> > > > BooleanQuery that is added BooleanClauses, each with is Term
>> > > > (field:value)?
>> > > > You can add clauses w/ OR, AND, NOT etc.
>> > > >
>> > > > Note that in Lucene 2.9, you can avoid scoring documents very easily,
>> > > > which
>> > > > is a performance win if you don't need scores (i.e. if you just want
>> to
>> > > > match everything, not caring for scores).
>> > > >
>> > > > Shai
>> > > >
>> > > > On Mon, Nov 30, 2009 at 5:47 PM, Michel Nadeau <aka...@gmail.com>
>> > wrote:
>> > > >
>> > > > > Hi,
>> > > > >
>> > > > > we use Lucene to store around 300 millions of records. We use the
>> > index
>> > > > > both
>> > > > > for conventional searching, but also for all the system's data - we
>> > > > > replaced
>> > > > > MySQL with Lucene because it was simply not working at all with
>> MySQL
>> > > > due
>> > > > > to
>> > > > > the amount or records. Our problem is that we have HUGE performance
>> > > > > problems... whenever we search, it takes forever to return results,
>> > and
>> > > > > Java
>> > > > > uses 100% CPU/RAM.
>> > > > >
>> > > > > Our index fields are like this:
>> > > > >
>> > > > > TYPE
>> > > > > PK
>> > > > > FOREIGN_PK
>> > > > > TAG
>> > > > > ...other information depending on type...
>> > > > >
>> > > > > * All fields are Field.Index.UN_TOKENIZED
>> > > > > * The field "TAG" always contains the value "TAG".
>> > > > >
>> > > > > Whenever we search in the index, our query is "TAG:TAG" to match
>> all
>> > > > > documents, and we do the search like this:
>> > > > >
>> > > > >        // Search
>> > > > >        Hits h = searcher.search(q, cluCF, cluSort);
>> > > > >
>> > > > > cluCF is a ChainedFilter containing all the other filters (like
>> > > > > FOREIGN_PK=12345, TYPE=a, etc.).
>> > > > >
>> > > > > I know that the method is probably crazy because "TAG:TAG" is
>> > matching
>> > > > all
>> > > > > 300M documents and then it applies filters; so that's probably why
>> > > every
>> > > > > little query is taking 100% CPU/RAM.... but I don't know how to do
>> it
>> > > > > properly.
>> > > > >
>> > > > > Help ! Any advice is welcome.
>> > > > >
>> > > > > - Mike
>> > > > > aka...@gmail.com
>> > > > >
>> > >
>> > >
>> > > ---------------------------------------------------------------------
>> > > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>> > > For additional commands, e-mail: java-user-h...@lucene.apache.org
>> > >
>> > >
>> >
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org

Reply via email to