changing the way search workd to accommodate for georestrictions

This commit is contained in:
Sam
2021-03-11 11:33:12 +00:00
parent 5178eb9722
commit 9794ab1f18
3 changed files with 22 additions and 1 deletions

View File

@@ -567,6 +567,7 @@ class ProductSearchTest(TestCase):
self.assertIsNotNone(payload.get('prices')) self.assertIsNotNone(payload.get('prices'))
# 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 for filters # check for filters
self.assertTrue(len(payload['filters']['tags']) >= 2 ) self.assertTrue(len(payload['filters']['tags']) >= 2 )

View File

@@ -144,7 +144,12 @@ def ranked_product_search(keyword, shipping_cost=None, discount=None, category=N
- georesult - georesult
""" """
vector = SearchVector('name') + SearchVector('description') + SearchVector('tags__label') + SearchVector('attributes__label') + SearchVector('category__label') + SearchVector('company__company_name') vector = SearchVector('name') + SearchVector('description') + SearchVector('tags__label') + SearchVector('attributes__label') + SearchVector('category__label') + SearchVector('company__company_name')
query = SearchQuery(keyword)
query_string = ''
for word in keyword:
query_string += f" | '{keyword}' "
query = SearchQuery(query_string)
products_qs = Product.objects.annotate( products_qs = Product.objects.annotate(
rank=SearchRank(vector, query) rank=SearchRank(vector, query)

View File

@@ -201,6 +201,20 @@ def product_search(request):
else: else:
# split query string into single words # split query string into single words
chunks = q.split(' ') chunks = q.split(' ')
# all-in-one search
product_set, min_price, max_price, georesult = ranked_product_search(chunks, shipping_cost, discount, category, tags, price_min, price_max, coordinates)
# update price values
if product_set:
if prices['min'] is None or min_price['price__min'] < prices['min']:
prices['min'] = min_price['price__min']
if prices['max'] is None or max_price['price__max'] > prices['max']:
prices['max'] = max_price['price__max']
# add to result set
result_set.update(product_set)
# serialize and list data
serializer = SearchResultSerializer(product_set, many=True)
result_list = [dict(i) for i in serializer.data]
'''
for chunk in chunks: for chunk in chunks:
product_set, min_price, max_price, georesult = ranked_product_search(chunk, shipping_cost, discount, category, tags, price_min, price_max, coordinates) product_set, min_price, max_price, georesult = ranked_product_search(chunk, shipping_cost, discount, category, tags, price_min, price_max, coordinates)
# update price values # update price values
@@ -214,6 +228,7 @@ def product_search(request):
# serialize and list data # serialize and list data
serializer = SearchResultSerializer(product_set, many=True) serializer = SearchResultSerializer(product_set, many=True)
result_list = [dict(i) for i in serializer.data] result_list = [dict(i) for i in serializer.data]
'''
# extract filters from result_set # extract filters from result_set
filters = extract_search_filters(result_set) filters = extract_search_filters(result_set)