diff --git a/products/tests.py b/products/tests.py index 2e4f24e..412bae1 100644 --- a/products/tests.py +++ b/products/tests.py @@ -463,11 +463,13 @@ class ProductSearchTest(TestCase): expected_instances = [ self.factory(tags="lunares/blancos",description="zapatos verdes"), # TODO: workaround vectorized search not liking nested tags - # self.factory(tags="colores/rojos, tono/brillante"), - self.factory(tags="colores, rojos"), + self.factory(tags="colores/rojos, tono/brillante"), + # self.factory(tags="colores, rojos"), self.factory(tags="lunares/azules", description="zapatos rojos"), self.factory(tags="lunares/rojos", description="zapatos"), self.factory(attributes='"zapatos de campo", tono/oscuro'), + # TODO: workaround multi-word tags + # self.factory(attributes='zapatos, "zapatos de campo", tono/oscuro'), ] unexpected_instances = [ self.factory(description="chanclas"), @@ -485,8 +487,11 @@ class ProductSearchTest(TestCase): # load response data payload = response.json() # check for object creation - + import ipdb; ipdb.set_trace() self.assertEquals(len(payload['products']), len(expected_instances)) + # check ids + for i in range(len(payload['products'])): + self.assertTrue(payload['products'][i]['id'] == expected_instances[i].id) # check for filters self.assertNotEquals([], payload['filters']['singles']) self.assertTrue(len(payload['filters']) >= 2 ) diff --git a/products/utils.py b/products/utils.py index 44565d6..a4c0426 100644 --- a/products/utils.py +++ b/products/utils.py @@ -75,14 +75,23 @@ def find_related_products(keyword): return products_qs -def alt_find_related_products(keyword): +def alt_rank_find_related_products(keyword): + # TODO: figure out why it includes unrelated instances fields=('name', 'description', 'tags__name', 'attributes__name', 'category__name') vector = SearchVector(*fields) - products_qs = Product.objects.annotate(search=vector).filter(search=keyword) + query = SearchQuery(keyword) + products_qs = Product.objects.annotate( + rank=SearchRank(vector, query) + ).order_by('-rank') + import ipdb; ipdb.set_trace() return products_qs -def search_by_phrase(phrase): - SearchQuery(phrase, search_type='phrase') - pass +def alt_find_related_products(keyword): + fields=('name', 'description', 'tags__name', 'attributes__name', 'category__name') + vector = SearchVector(*fields) + products_qs = Product.objects.annotate( + search=vector + ).filter(search=keyword) + return products_qs diff --git a/products/views.py b/products/views.py index ea8bc4b..b1a6194 100644 --- a/products/views.py +++ b/products/views.py @@ -23,7 +23,7 @@ from companies.models import Company from history.models import HistorySync from back_latienda.permissions import IsCreator -from .utils import extract_search_filters, find_related_products, alt_find_related_products +from .utils import extract_search_filters, find_related_products, alt_find_related_products, alt_rank_find_related_products from utils.tag_serializers import TaggitSerializer from utils.tag_filters import ProductTagFilter @@ -156,7 +156,8 @@ def product_search(request): for chunk in chunks: # products_qs = find_related_products(chunk) - products_qs = alt_find_related_products(chunk) + # products_qs = alt_find_related_products(chunk) + products_qs = alt_rank_find_related_products(chunk) for instance in products_qs: result_set.add(instance)