diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2006-11-22 15:55:05 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2006-11-22 15:55:05 +0000 |
commit | 84151d0644981341bc92df1083ed316e8df75327 (patch) | |
tree | eff33b5d4a0dc3c0aa55eb3b238045e803fb07ff | |
parent | ba2edcac4fd3c41b58a72f0244ebc0caaeead4af (diff) | |
download | postgresql-84151d0644981341bc92df1083ed316e8df75327.tar.gz |
Avoid infinity calculations in rank_cd
-rw-r--r-- | contrib/tsearch2/rank.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/contrib/tsearch2/rank.c b/contrib/tsearch2/rank.c index f8a7d5f2f0..7bd5e1adf0 100644 --- a/contrib/tsearch2/rank.c +++ b/contrib/tsearch2/rank.c @@ -667,6 +667,7 @@ calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method) { double Cpos = 0.0; double InvSum = 0.0; + int nNoise; DocRepresentation *ptr = ext.begin; while (ptr <= ext.end) @@ -676,7 +677,16 @@ calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method) } Cpos = ((double) (ext.end - ext.begin + 1)) / InvSum; - Wdoc += Cpos / ((double) ((1 + (ext.q - ext.p) - (ext.end - ext.begin)))); + /* + * if doc are big enough then ext.q may be equal to ext.p + * due to limit of posional information. In this case we + * approximate number of noise word as half cover's + * length + */ + nNoise = (ext.q - ext.p) - (ext.end - ext.begin); + if ( nNoise < 0 ) + nNoise = (ext.end - ext.begin) / 2; + Wdoc += Cpos / ((double) (1 + nNoise)); CurExtPos = ((double) (ext.q + ext.p)) / 2.0; if (NExtent > 0 && CurExtPos > PrevExtPos /* prevent devision by |