diff --git a/xapian-core/matcher/selectpostlist.cc b/xapian-core/matcher/selectpostlist.cc
index 28f2544..a5de30d 100644
--- a/xapian-core/matcher/selectpostlist.cc
+++ b/xapian-core/matcher/selectpostlist.cc
@@ -34,7 +34,9 @@ SelectPostList::next(double w_min)
         PostList *p = source->next(w_min);
 	(void)p;
 	Assert(p == NULL); // AND should never prune
-    } while (!source->at_end() && !test_doc());
+	wt = -1;
+    } while (!source->at_end() &&
+	     (SelectPostList::get_weight() < w_min || !test_doc()));
     RETURN(NULL);
 }
 
@@ -46,7 +48,9 @@ SelectPostList::skip_to(Xapian::docid did, double w_min)
 	PostList *p = source->skip_to(did, w_min);
 	(void)p;
 	Assert(p == NULL); // AND should never prune
-        if (!source->at_end() && !test_doc())
+	wt = -1;
+	if (!source->at_end() &&
+	    (SelectPostList::get_weight() < w_min || !test_doc()))
 	    RETURN(SelectPostList::next(w_min));
     }
     RETURN(NULL);
@@ -59,7 +63,9 @@ SelectPostList::check(Xapian::docid did, double w_min, bool &valid)
     PostList *p = source->check(did, w_min, valid);
     (void)p;
     Assert(p == NULL); // AND should never prune
-    if (valid && !source->at_end() && !test_doc())
+    wt = -1;
+    if (valid && !source->at_end() &&
+	(SelectPostList::get_weight() < w_min || !test_doc()))
 	valid = false;
     RETURN(NULL);
 }
diff --git a/xapian-core/matcher/selectpostlist.h b/xapian-core/matcher/selectpostlist.h
index 41151f9..c06b9e3 100644
--- a/xapian-core/matcher/selectpostlist.h
+++ b/xapian-core/matcher/selectpostlist.h
@@ -36,6 +36,7 @@ class SelectPostList : public PostList {
 
     protected:
 	PostList *source;
+	mutable double wt;
 
 	/** Subclasses should override test_doc() with a method which returns
 	 *  true if a document meets the appropriate criterion, false in not
@@ -51,7 +52,11 @@ class SelectPostList : public PostList {
 	Xapian::doccount get_termfreq_min() const { return 0; }
 	double get_maxweight() const { return source->get_maxweight(); }
 	Xapian::docid get_docid() const { return source->get_docid(); }
-	double get_weight() const { return source->get_weight(); }
+	double get_weight() const {
+	    if (wt < 0.0)
+		wt = source->get_weight();
+	    return wt;
+	}
 	Xapian::termcount get_doclength() const { return source->get_doclength(); }
 	double recalc_maxweight() { return source->recalc_maxweight(); }
 	PositionList * read_position_list() { return source->read_position_list(); }
@@ -64,7 +69,7 @@ class SelectPostList : public PostList {
 
 	std::string get_description() const;    
     
-	SelectPostList(PostList *source_) : source(source_) { }
+	SelectPostList(PostList *source_) : source(source_), wt(-1) { }
         ~SelectPostList() { delete source; }
 };
 
