It sounds as if what you have done is to index sales events (with fields customer, product, and date), and now you want to retrieve customers, which are not documents. The most natural way to handle this is to index customers as documents (with fields cust id, last sale date). Whenever a new sale comes in for a customer, update the customers' most recent sale date. Then the query side is simple. You might be able to accomplish keeping this up to date using some kind of copy-field (a bit like a database trigger).

-Mike

On 3/4/2011 10:31 AM, Peter Sturge wrote:
Hi,

Oh, how I wish it was as simple as that! :-)
The tricky ingredient in the use case is to exclude all documents (from any
'saledate') if there's a "recent" 'product' match (e.g. last month).
So, essentially you have to somehow build a query that looks at 2 different
criteria for the same field ('saledate'). This requires the criteria to be
applied at the DocSet level,
rather than on each Document (or, do them sequentially like in SOLR-2026).

I've been having a look at Karl's SOLR-2026, which looks very interesting,
but I've not got it working on trunk as yet.
The only other way I can see is to do multiple client-side round-trip
queries - using the results of the initial search as a filter for the
second.
It's a bit messy, and not a performance winner (esp w/ distributed searches
on large indexes), so hopefully a server-side solution is out there.

Thanks!
Peter





On Fri, Mar 4, 2011 at 2:14 PM, Savvas-Andreas Moysidis<
savvas.andreas.moysi...@googlemail.com>  wrote:

Can you not calculate on the fly when the date which is one month before
the
current is and use that as your upper limit?

e.g. taking today as an example your upper limit would be
20011-02-04T00:00:00Z
and so your query would be something like:
q=products:Dog AND saledate:[* TO 20011-02-04T00:00:00Z]


On 4 March 2011 11:40, Peter Sturge<peter.stu...@gmail.com>  wrote:

Hello,

I've been wrestling with a query use case, perhaps someone has done this
already?
Is it possible to write a query that excludes results based on another
query?

Scenario:
I have an index that holds:
   'customer'  (textgen)
   'product'   (textgen)
   'saledate'   (date)

I'm looking to return documents for 'customer' entries who have bought a
'product' in the past, but haven't bought in, say, the last month.
(i.e. need to exclude *all* 'customer' documents who have bought
'product'
in the last month, as well as those who have never bought 'product')

A very simple query like this:
     q=products:Dog AND -(products:Dog AND saledate:[2011-01-01T00:00:00Z
TO
*])
returns 'Dog' documents prior to 1 Jan, but these need to be excluded if
there are matches after 1 Jan.
I wasn't expecting the above query to do the extra exclusion - it's just
to
illustrate the general problem that it operates at document level, not
query
level (like a SQL subquery).
If I could could pipe the results of the above to another query, that
would
likely do the trick.
I've tried negative boosts, magic _query_, query() and such, but with no
luck.

Is this possible?
Any insight into how to write such a query would be much appreciated!

Thanks,
Peter


Reply via email to