summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2006-11-22 15:55:05 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2006-11-22 15:55:05 +0000
commit84151d0644981341bc92df1083ed316e8df75327 (patch)
treeeff33b5d4a0dc3c0aa55eb3b238045e803fb07ff
parentba2edcac4fd3c41b58a72f0244ebc0caaeead4af (diff)
downloadpostgresql-84151d0644981341bc92df1083ed316e8df75327.tar.gz
Avoid infinity calculations in rank_cd
-rw-r--r--contrib/tsearch2/rank.c12
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