X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;ds=sidebyside;f=index%2Fzsets.c;h=15fa83c9934bae3744a0568efa9de0786b319820;hb=5660e317ea2972ea6bb6a4f8a415f71579f71103;hp=a26ac401fb1a6d4b5012fa08b4c2b35e5d09de48;hpb=2e4e9c6def27f1e1463dcb6f205fab6a98054f38;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index a26ac40..15fa83c 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.50 2004-08-04 08:35:24 adam Exp $ +/* $Id: zsets.c,v 1.52 2004-08-06 10:09:27 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -718,7 +718,7 @@ RSET resultSetRef (ZebraHandle zh, const char *resultSetId) void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) { - int kno = 0; + zint kno = 0; struct it_key key; RSFD rfd; int term_index, i; @@ -726,6 +726,9 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) struct rank_control *rc; struct zset_sort_info *sort_info; const char *rank_handler_name = res_get_def(zh->res, "rank", "rank-1"); + double cur,tot; + zint est=-2; /* -2 not done, -1 can't do, >0 actual estimate*/ + zint esthits; sort_info = zebraSet->sort_info; sort_info->num_entries = 0; @@ -753,6 +756,8 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) void *handle = (*rc->begin) (zh->reg, rank_class->class_handle, rset); (zebraSet->hits)++; + esthits=atoi(res_get_def(zh->res,"estimatehits","0")); + if (!esthits) est=-1; /* can not do */ do { #if IT_KEY_NEW @@ -770,8 +775,26 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) psysno = this_sys; } (*rc->add) (handle, this_sys, term_index); + if ( (est==-2) && (zebraSet->hits==esthits)) + { /* time to estimate the hits */ + float f; + rset_pos(rset,rfd,&cur,&tot); + if (tot>0) { + f=1.0*cur/tot; + est=(zint)(0.5+zebraSet->hits/f); + /* FIXME - round the guess to 3 digits */ + logf(LOG_LOG, "Estimating hits (%s) " + "%0.1f->%d" + "; %0.1f->"ZINT_FORMAT, + rset->control->desc, + cur, zebraSet->hits, + tot,est); + zebraSet->hits=est; + } + } } - while (rset_read (rset, rfd, &key, &term_index)); + while (rset_read (rset, rfd, &key, &term_index) && (est<0) ); + score = (*rc->calc) (handle, psysno); resultSetInsertRank (zh, sort_info, psysno, score, 'A'); (*rc->end) (zh->reg, handle); @@ -785,7 +808,8 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) rset->rset_terms[i]->flags, rset->rset_terms[i]->count); - yaz_log (LOG_LOG, "%d keys, %d distinct sysnos", kno, zebraSet->hits); + yaz_log (LOG_LOG, ZINT_FORMAT " keys, %d distinct sysnos", + kno, zebraSet->hits); } ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)