Implemented more_like_this

This commit is contained in:
David Sauve 2009-06-17 16:54:39 -04:00
parent 2c80f85ec6
commit fa02d65941
2 changed files with 19 additions and 10 deletions

View file

@ -163,8 +163,8 @@ class XapianSearchBackendTestCase(TestCase):
self.sb.update(self.msi, self.sample_objs)
self.assertEqual(len(self.xapian_search('')), 3)
# TODO: Until this is implemented, we should see empty results.
self.assertEqual(self.sb.more_like_this(self.sample_objs[0])['hits'], 0)
self.assertEqual(self.sb.more_like_this(self.sample_objs[0])['hits'], 3)
self.assertEqual([dict(doc) for doc in self.xapian_search('')], [{'name': u'david1', 'text': u'Indexed!\n1', 'pub_date': u'2009-02-24T00:00:00', 'id': u'tests.mockmodel.1'}, {'name': u'david2', 'text': u'Indexed!\n2', 'pub_date': u'2009-02-23T00:00:00', 'id': u'tests.mockmodel.2'}, {'name': u'david3', 'text': u'Indexed!\n3', 'pub_date': u'2009-02-22T00:00:00', 'id': u'tests.mockmodel.3'}])
def test_document_count(self):
self.sb.update(self.msi, self.sample_objs)

View file

@ -104,7 +104,7 @@ class SearchBackend(BaseSearchBackend):
enquire = xapian.Enquire(database)
enquire.set_query(query)
for match in enquire.get_mset(0, DEFAULT_MAX_RESULTS):
database.delete_document(match.get_document().get_docid())
database.delete_document(match.get_docid())
else:
for model in models:
database.delete_document(DOCUMENT_CT_TERM_PREFIX + '%s.%s' % (model._meta.app_label, model._meta.module_name))
@ -170,7 +170,22 @@ class SearchBackend(BaseSearchBackend):
return 0
return database.get_doccount()
def _process_results(self, matches, facets, highlights=[]):
def more_like_this(self, model_instance):
database = xapian.Database(self.path)
query = xapian.Query(DOCUMENT_ID_TERM_PREFIX + self.get_identifier(model_instance))
enquire = xapian.Enquire(database)
enquire.set_query(query)
rset = xapian.RSet()
for match in enquire.get_mset(0, DEFAULT_MAX_RESULTS):
rset.add_document(match.get_docid())
query = xapian.Query(xapian.Query.OP_OR,
[expand.term for expand in enquire.get_eset(DEFAULT_MAX_RESULTS, rset)]
)
enquire.set_query(query)
matches = enquire.get_mset(0, DEFAULT_MAX_RESULTS)
return self._process_results(matches)
def _process_results(self, matches, facets=None, highlights=[]):
facets_dict = {
'fields': {},
'dates': {},
@ -227,12 +242,6 @@ class SearchBackend(BaseSearchBackend):
value = force_unicode(value)
return value
def more_like_this(self, model_instance):
return {
'results': [],
'hits': 0,
}
class SearchQuery(BaseSearchQuery):
def __init__(self, backend=None):