[Zope] Help with Search in Zope

Chris McDonough chrism@digicool.com
Tue, 10 Apr 2001 10:41:41 -0400


>    There are so many questions and problems and deficiencies about
> ZCatalog. Think for example I want to index a site on
> bobobase_modification_time and search for date ranges. Impossible!
ZCatalog
> does not have ranges.

Yes it does.  See the section titled "Searching Field Indexes" in the Zope
Book.

>    Recently added textindex_operator allows to use "and", "near",
"andnot",
> "or" operators, but it is insufficient. I can only use the operator for
one
> index. What if I want to search for
>    "title LIKE '%ZOPE% OR body LIKE '%python%'"? Alas!
> Developing special SQL-like language for ZCatalog? It is hard. What than?

You currently need to union and/or intersect the result sets manually.  It
*is* hard, yes.  ;-)

>    A crazy idea sprang into my mind. What if I, the site programmer, could
> provide a callback function, and ZCatalog will call the function for every
> index? Then I can code such simple or complex search as I need. Examples:
>
>    <dtml-in "Catalog(indicies=['id', 'titile', 'time'],
callback=mySearch)">
>
> def mySearch(id, titile, time):
>    if re.search("ZOPE", id): return 1
>    if re.search("python", title, re.I): return 1
>    if "2000/01/01" <= time <= "2000/12/31": return 1
>    return 0
>
> Let the function return 1 for objects that correspond the serach criteria,
> 0 for failed objects, and raise StopSearch exception if it need to stop
> search immediatly.

THis is a pretty cool idea... except I think that it might be better to just
use the callback to aggregate search results in interesting ways on a
per-index basis.  For instance, if you specify three indexes in a query and
specify a callback, the callback can do unions or intersections on the
result sets returned from each index manually...