: Another, faulty, option would be to model opening/closing hours in 2
: multivalued date-fields, i.e: open, close. and insert open/close for each
: day, e.g: 
: 
: open: 2011-11-08:1800 - close: 2011-11-09:0300
: open: 2011-11-09:1700 - close: 2011-11-10:0500
: open: 2011-11-10:1700 - close: 2011-11-11:0300
: 
: And queries would be of the form:
: 
: 'open < now && close > now+3h'
: 
: But since there is no way to indicate that 'open' and 'close' are pairwise
: related I will get a lot of false positives, e.g the above document would be
: returned for:

This isn't possible out of the box, but the general idea of "position 
linked" queries is possible using the same approach as the 
FieldMaskingSpanQuery...

https://lucene.apache.org/java/3_4_0/api/core/org/apache/lucene/search/spans/FieldMaskingSpanQuery.html
https://issues.apache.org/jira/browse/LUCENE-1494

..implementing something like this that would work with 
(Numeric)RangeQueries however would require some additional work, but it 
should certianly be doable -- i've suggested this before but no one has 
taken me up on it...
http://markmail.org/search/?q=hoss+FieldMaskingSpanQuery

If we take it as a given that you can do multiple ranges "at the same 
position", then you can imagine supporting all of your "regular" hours 
using just two fields ("open" and "close") by encoding the day+time of 
each range of open hours into them -- even if a store is open for multiple 
sets of ranges per day (ie: closed for siesta)...

  open: mon_12_30, tue_12_30, wed_07_30, wed_3_30, ...
  close: mon_20_00, tue_20_30, wed_12_30, wed_22_30, ...

then asking for "stores open now and for the next 3 hours" on "wed" at 
"2:13PM" becomes a query for...

sameposition(open:[* TO wed_14_13], close:[wed_17_13 TO *])

For the special case part of your problem when there are certain dates 
that a store will be open atypical hours, i *think* that could be solved 
using some special docs and the new "join" QParser in a filter query...

        https://wiki.apache.org/solr/Join

imagine you have your "regular" docs with all the normal data about a 
store, and the open/close fields i describe above.  but in addition to 
those, for any store that you know is "closed on dec 25" or "only open 
12:00-15:00 on Jan 01" you add an additional small doc encapsulating 
the information about the stores closures on that special date - so that 
each special case would be it's own doc, even if one store had 5 days 
where there was a special case...

  specialdoc1:
    store_id: 42
    special_date: Dec-25
    status: closed
  specialdoc2:
    store_id: 42
    special_date: Jan-01
    status: irregular
    open: 09_30
    close: 13_00

then when you are executing your query, you use an "fq" to constrain to 
stores that are (normally) open right now (like i mentioned above) and you 
use another fq to find all docs *except* those resulting from a join 
against these special case docs based on the current date.

so if you r query is "open now and for the next 3 hours" and "now" == 
"sunday, 2011-12-25 @ 10:17AM your query would be something like...

q=...user input...
time=sameposition(open:[* TO sun_10_17], close:[sun_13_17 TO *])
fq={!v=time}
fq={!join from=store_id to=unique_key v=$vv}
vv=-(+special_date:Dec-25 +(status:closed OR _query_:"{v=$time}"))

That join based approach for dealing with the special dates should work 
regardless of wether someone implements a way to do pair wise 
"sameposition()" rangequeries ... so if you can live w/o the multiple 
open/close pairs per day, you can just use the "one field per day of hte 
week" type approach you mentioned combined with the "join" for special 
case days of hte year and everything you need should already work w/o any 
code (on trunk).

(disclaimer: obviously i haven't tested that query, the exact syntax may 
be off but the princible for modeling the "special docs" and using 
them in a join should work)


-Hoss

Reply via email to