working on ranked search results

This commit is contained in:
Sam
2021-02-18 13:08:23 +00:00
parent 20b9c395c2
commit 47633c889d
3 changed files with 25 additions and 10 deletions

View File

@@ -463,11 +463,13 @@ class ProductSearchTest(TestCase):
expected_instances = [ expected_instances = [
self.factory(tags="lunares/blancos",description="zapatos verdes"), self.factory(tags="lunares/blancos",description="zapatos verdes"),
# TODO: workaround vectorized search not liking nested tags # TODO: workaround vectorized search not liking nested tags
# self.factory(tags="colores/rojos, tono/brillante"), self.factory(tags="colores/rojos, tono/brillante"),
self.factory(tags="colores, rojos"), # self.factory(tags="colores, rojos"),
self.factory(tags="lunares/azules", description="zapatos rojos"), self.factory(tags="lunares/azules", description="zapatos rojos"),
self.factory(tags="lunares/rojos", description="zapatos"), self.factory(tags="lunares/rojos", description="zapatos"),
self.factory(attributes='"zapatos de campo", tono/oscuro'), self.factory(attributes='"zapatos de campo", tono/oscuro'),
# TODO: workaround multi-word tags
# self.factory(attributes='zapatos, "zapatos de campo", tono/oscuro'),
] ]
unexpected_instances = [ unexpected_instances = [
self.factory(description="chanclas"), self.factory(description="chanclas"),
@@ -485,8 +487,11 @@ class ProductSearchTest(TestCase):
# load response data # load response data
payload = response.json() payload = response.json()
# check for object creation # check for object creation
import ipdb; ipdb.set_trace()
self.assertEquals(len(payload['products']), len(expected_instances)) 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 # check for filters
self.assertNotEquals([], payload['filters']['singles']) self.assertNotEquals([], payload['filters']['singles'])
self.assertTrue(len(payload['filters']) >= 2 ) self.assertTrue(len(payload['filters']) >= 2 )

View File

@@ -75,14 +75,23 @@ def find_related_products(keyword):
return products_qs 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') fields=('name', 'description', 'tags__name', 'attributes__name', 'category__name')
vector = SearchVector(*fields) 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 return products_qs
def search_by_phrase(phrase): def alt_find_related_products(keyword):
SearchQuery(phrase, search_type='phrase') fields=('name', 'description', 'tags__name', 'attributes__name', 'category__name')
pass vector = SearchVector(*fields)
products_qs = Product.objects.annotate(
search=vector
).filter(search=keyword)
return products_qs

View File

@@ -23,7 +23,7 @@ from companies.models import Company
from history.models import HistorySync from history.models import HistorySync
from back_latienda.permissions import IsCreator 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_serializers import TaggitSerializer
from utils.tag_filters import ProductTagFilter from utils.tag_filters import ProductTagFilter
@@ -156,7 +156,8 @@ def product_search(request):
for chunk in chunks: for chunk in chunks:
# products_qs = find_related_products(chunk) # 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: for instance in products_qs:
result_set.add(instance) result_set.add(instance)