Unfortuantely at the moment we don't make good use of lucene caching, so
the setting up of the filter on startup doesn't really work for us at
the moment. Maybe just a general flag field instead of a hasname field
would work better and be more general. You could just fill this field
with any flags that need to be set for the particular document. Each
flag has a different unique tag that gets concatinated into the field
then you can make use of your filters with:
flagfield:(+hasfirstname +haslastname)
and the like.
How does this sound?
Les
Erick Erickson wrote:
I was going to suggest something about TermEnum/TermDocs, but
upon reflection that doesn't work so well because you have to
enumerate all the terms over all the docs for a field. Ouch.
But one could combine the two approaches. Don't index
any "special" values in your firstname or lastname fields.
I suspect this will hurt you down the road...
Instead, ONLY for those documents that DO have either a first
or last name, index an orthogonal field, HASNAMES with
a single value of "yes" or something. Now you can construct
your filter efficiently by enumerating the HASNAMES terms/docs
by only enumerating a single term/value.
Depending upon how big your index is, you might be able to
get away with the termenum/terndocs approach by constructing
your filter at start-up time and caching it away somewhere...
You *might* also be able to do something at startup time like
for (each document in the index) {
get the firstname and lastname. If both null, set your filter bit
}
If you use the lazy loading, you may be able to do this without
loading all of every document....
I'm curious to know what you settle on and how it works....
Does this make sense in your application?
Erick
On 5/10/07, Les Fletcher <[EMAIL PROTECTED]> wrote:
I like the idea of the filter since I am making heavy use of filters for
this particular query, but how would one go about constructing it
efficiently at query time? All I can see is hacking around not being
able to use the * as the first character.
Les
Erick Erickson wrote:
> You could create a Lucene Filter that had a bit for each document that
> had a first or last name and use that at query time to restrict your
> results appropriately. You could create this at startup time or at
> query time. See CachingWrapperFilter for a way to cache it.
>
>
> Another approach would be to add a dummy field to each document,
> something like HASFIRSTORLASTNAME. At index time, when
> you index a document, if it has a first or last name, put "yes" in the
> field. Otherwise, put "no".
>
> Then, at search time, add an +HASFIRSTORLASTNAME:yes to the
> query......
>
> You could add as many states to this field as you want.
>
>
> Erick
>
>
> On 5/10/07, Les Fletcher <[EMAIL PROTECTED]> wrote:
>
>>
>> I have a question about empty fields. I want to run a query that
will
>> search against a few particular fields for the query term but then
also
>> also check to see if a two other fields have any value at all.
i.e., I
>> want to search for a set records but don't want to return a record if
>> that record has blank first and last name fields. Any help would be
>> greatly appreciated.
>>
>> Les
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]