Skip to content

Commit

Permalink
Implemented boost
Browse files Browse the repository at this point in the history
  • Loading branch information
notanumber committed Aug 7, 2009
1 parent c496682 commit 1ef902e
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 19 deletions.
10 changes: 10 additions & 0 deletions tests/xapian_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,16 @@ def test_order_by(self):
results = self.sb.search('*', sort_by=['flag', '-id'])
self.assertEqual([result.pk for result in results['results']], [2, 3, 1])

def test_boost(self):
self.sb.update(self.msi, self.sample_objs)

# TODO: Need a better test case here. Possibly better test data?
results = self.sb.search('*', boost={'true': 2})
self.assertEqual([result.pk for result in results['results']], [1, 3, 2])

results = self.sb.search('*', boost={'true': 1.5})
self.assertEqual([result.pk for result in results['results']], [1, 3, 2])

def test__marshal_value(self):
self.assertEqual(self.sb._marshal_value('abc'), u'abc')
self.assertEqual(self.sb._marshal_value(1), '\xa0')
Expand Down
5 changes: 0 additions & 5 deletions tests/xapian_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,6 @@ def test_build_query_phrase(self):
self.sq.add_filter('content', 'hello world')
self.assertEqual(self.sq.build_query(), '"hello world"')

# def test_build_query_boost(self):
# self.sq.add_filter('content', 'hello')
# self.sq.add_boost('world', 5)
# self.assertEqual(self.sq.build_query(), "hello world^5")
#
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))
Expand Down
34 changes: 20 additions & 14 deletions xapian_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ def clear(self, models=[]):

def search(self, query_string, sort_by=None, start_offset=0, end_offset=DEFAULT_MAX_RESULTS,
fields='', highlight=False, facets=None, date_facets=None, query_facets=None,
narrow_queries=None, **kwargs):
narrow_queries=None, boost=None, **kwargs):
"""
Executes the search as defined in `query_string`.
Expand All @@ -264,6 +264,7 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=DEFAULT_
`date_facets` -- Facet results on date ranges (default = None)
`query_facets` -- Facet results on queries (default = None)
`narrow_queries` -- Narrow queries (default = None)
`boost` -- Dictionary of terms and weights to boost results
Returns:
A dictionary with the following keys:
Expand Down Expand Up @@ -305,7 +306,9 @@ def search(self, query_string, sort_by=None, start_offset=0, end_offset=DEFAULT_
warnings.warn("Query faceting has not been implemented yet.", Warning, stacklevel=2)

database = self._database()
query, spelling_suggestion = self._query(database, query_string, narrow_queries)
query, spelling_suggestion = self._query(
database, query_string, narrow_queries, boost
)
enquire = self._enquire(database, query)

if sort_by:
Expand Down Expand Up @@ -535,7 +538,7 @@ def _term_generator(self, database, document):
term_generator.set_document(document)
return term_generator

def _query(self, database, query_string, narrow_queries=None):
def _query(self, database, query_string, narrow_queries=None, boost=None):
"""
Private method that takes a query string and returns a xapian.Query.
Expand All @@ -544,6 +547,7 @@ def _query(self, database, query_string, narrow_queries=None):
Optional arguments:
`narrow_queries` -- A list of queries to narrow the query with
`boost` -- A dictionary of terms to boost with values
Returns a xapian.Query instance with prefixes and ranges properly
setup as pulled from the `query_string`.
Expand All @@ -569,6 +573,16 @@ def _query(self, database, query_string, narrow_queries=None):
xapian.Query.OP_FILTER,
query, xapian.Query(xapian.Query.OP_AND, subqueries)
)
if boost:
subqueries = [
xapian.Query(
xapian.Query.OP_SCALE_WEIGHT, xapian.Query(term), value
) for term, value in boost.iteritems()
]
query = xapian.Query(
xapian.Query.OP_OR, query,
xapian.Query(xapian.Query.OP_AND, subqueries)
)

return query, spelling_suggestion

Expand Down Expand Up @@ -772,17 +786,6 @@ def build_query(self):
else:
final_query = query

# print final_query

# TODO: Implement boost
# if self.boost:
# boost_list = []
#
# for boost_word, boost_value in self.boost.items():
# boost_list.append("%s^%s" % (boost_word, boost_value))
#
# final_query = "%s %s" % (final_query, " ".join(boost_list))

return final_query

def run(self):
Expand Down Expand Up @@ -814,6 +817,9 @@ def run(self):

if self.narrow_queries:
kwargs['narrow_queries'] = self.narrow_queries

if self.boost:
kwargs['boost'] = self.boost

results = self.backend.search(final_query, **kwargs)
self._results = results.get('results', [])
Expand Down

0 comments on commit 1ef902e

Please sign in to comment.