I'm using function queries to boost more recent documents, using
something like the

    recip(ms(NOW,mydatefield),3.16e-11,1,1)

approach described on the wiki:
http://wiki.apache.org/solr/FunctionQuery#Date_Boosting

What I'd like to do is figure out the best way to tweak how documents
with missing date fields are handled.

For reference, what the above expression does with docs with missing
mydatefield values is to treat those docs as if they were dated at the
epoch start. (This is because the default value for a missing field,
including a date field, is 0.)

What I want to try, in contrast, is to treat docs with missing dates
as if they were dated NOW. Can anyone suggest a satisfying way to do
this? Here are some options that won't work:

Option 1. Use map

The most obvious way to do this would be to wrap the reference to
mydatefield inside a map, like this:

    recip(ms(NOW,map(mydatefield,0,0,ms(NOW)),3.16e-11,1,1))

However, this throws an exception because map is hard-coded to take
float constants, rather than arbitrary subqueries.

Option 2. Use min

The second most obvious way is to replace ms(NOW,mydatefield) with
this expression:

    min(ms(NOW),ms(NOW,mydatefield)

(Docs with mydatefield will have a very large ms(NOW,mydatefield) term.)

However there is no min function, so that won't work.

Option 2a. Fake min with max and multiplication

Since min(a,b) == -1*max(-1*a, -1*b), you could rewrite the previous
expression using this more complicated logic and it would work. But
that's ugly.

Also, it would crash anyway. It looks like max currently requires one
of its arguments to be a float constant, and neither of our args would
be a float constant.

Reply via email to