From 3cacb54cf5a861dc1dd96b2a5c437f1f5de38782 Mon Sep 17 00:00:00 2001 From: David Sauve Date: Sun, 29 Nov 2009 16:05:36 -0500 Subject: [PATCH] Added term boosting --- tests/xapian_tests/tests/xapian_query.py | 10 +++++----- xapian_backend.py | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/xapian_tests/tests/xapian_query.py b/tests/xapian_tests/tests/xapian_query.py index ade3952..4bfde62 100644 --- a/tests/xapian_tests/tests/xapian_query.py +++ b/tests/xapian_tests/tests/xapian_query.py @@ -76,11 +76,11 @@ class XapianSearchQueryTestCase(TestCase): self.sq.add_filter(SQ(content='hello world')) self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query(hello world)') - # def test_build_query_boost(self): - # self.sq.add_filter(SQ(content='hello')) - # self.sq.add_boost('world', 5) - # self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query(hello world)') - # + def test_build_query_boost(self): + self.sq.add_filter(SQ(content='hello')) + self.sq.add_boost('world', 5) + self.assertEqual(self.sq.build_query().get_description(), 'Xapian::Query((hello OR 5 * world))') + # def test_build_query_multiple_filter_types(self): # self.sq.add_filter('content', 'why') # self.sq.add_filter('pub_date__lte', datetime.datetime(2009, 2, 10, 1, 59)) diff --git a/xapian_backend.py b/xapian_backend.py index fce13ab..039568e 100755 --- a/xapian_backend.py +++ b/xapian_backend.py @@ -911,9 +911,22 @@ class SearchQuery(BaseSearchQuery): def build_query(self): if not self.query_filter: - return xapian.Query('') + query = xapian.Query('') else: - return self._query_from_search_node(self.query_filter) + query = self._query_from_search_node(self.query_filter) + + if self.boost: + subqueries = [ + xapian.Query( + xapian.Query.OP_SCALE_WEIGHT, xapian.Query(term), value + ) for term, value in self.boost.iteritems() + ] + query = xapian.Query( + xapian.Query.OP_OR, query, + xapian.Query(xapian.Query.OP_AND, subqueries) + ) + + return query def _query_from_search_node(self, search_node, is_not=False): query_list = []