lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erik Hatcher <e...@ehatchersolutions.com>
Subject Re: Negative Match
Date Fri, 11 Feb 2005 15:25:11 GMT

On Feb 11, 2005, at 9:52 AM, Luke Shannon wrote:

> Hey Erik;
>
> The problem with that approach is I get document that don't have a
> kcfileupload field. This makes sense because these documents don't 
> match the
> prohibited
> clause, but doesn't fit with the requirements of the system.

Ok, so instead of using the dummy field with a single dummy value, use 
a dummy field to list the field names.  
Field.Keyword("fields","kcfileupload"), but only for the documents that 
should have it, of course.  Then use a query like (using QueryParser 
syntax, but do it with the API as you have since QueryParser doesn't 
support leading wildcards):

	+fields:kcfileupload -kcfileupload:*jpg*

Again, your approach is risky with term expansion.  Get more than 1,024 
unique kcfileupload values and you'll see!

	Erik


>
> What I like best about this approach is it doesn't require a filter. 
> The
> system I integrate with is presently designed to accept a query 
> object. I
> wasn't looking forward to having to add the possibility that queries 
> might
> require filters. I may have to still do this, but for now I would like 
> to
> try this and see how it goes.
>
> Thanks,
>
> Luke
>
> ----- Original Message -----
> From: "Erik Hatcher" <erik@ehatchersolutions.com>
> To: "Lucene Users List" <lucene-user@jakarta.apache.org>
> Sent: Thursday, February 10, 2005 7:23 PM
> Subject: Re: Negative Match
>
>
>>
>> On Feb 10, 2005, at 4:06 PM, Luke Shannon wrote:
>>
>>> I think I found a pretty good way to do a negative match.
>>>
>>> In this query I am looking for all the Documents that have a
>>> kcfileupload
>>> field with any value except for jpg.
>>>
>>>         Query negativeMatch = new WildcardQuery(new
>>> Term("kcfileupload",
>>> "*jpg*"));
>>>          BooleanQuery typeNegAll = new BooleanQuery();
>>>         Query allResults = new WildcardQuery(new Term("kcfileupload",
>>> "*"));
>>>         IndexSearcher searcher = new IndexSearcher(fsDir);
>>>         BooleanClause clause = new BooleanClause(negativeMatch, 
>>> false,
>>> true);
>>>         typeNegAll.add(allResults, true, false);
>>>         typeNegAll.add(clause);
>>>         Hits hits = searcher.search(typeNegAll);
>>>
>>> With the little testing I have done this *seems* to work. Does anyone
>>> see a
>>> problem with this approach?
>>
>> Sure.... do you realize what WildcardQuery does under the covers?  It
>> literally expands to a BooleanQuery for all terms that match the
>> pattern.  There is an adjustable limit built-in of 1,024 clauses to
>> BooleanQuery.  You obviously have not hit that limit ... yet!
>>
>> You're better off using the advice offered on this thread
>> previously.... create a single dummy field with a fixed value for all
>> documents.  Combine a TermQuery for that dummy value with a prohibited
>> clause like y our negativeMatch above.
>>
>> Erik
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: lucene-user-help@jakarta.apache.org
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: lucene-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: lucene-user-help@jakarta.apache.org


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


Mime
View raw message