Сложная поисковая система Django
Я хочу, чтобы моя поисковая система Django могла обрабатывать опечатки в названии элемента, который я буду отображать. Например, если пользователь вводит в поиск 'stacoverflow', я буду искать 'stackoverflow'. Затем я бы применил другие фильтры, которые у меня уже есть, и смог бы вывести результаты.
Что и как лучше всего сделать? Рассмотрите некоторые определенные строки и затем измените их значения, как?
Мои модели:
class Product(models.Model):
author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
category = models.ForeignKey(Category, default=None, on_delete=models.PROTECT)
title = models.CharField(max_length=120, unique=True)
# ...
Мои взгляды:
def is_valid_queryparam(param):
return param != '' and param is not None
def FilterView(request):
qs = Product.objects.all()
categories = Category.objects.all()
title_contains_query = request.GET.get('title_contains')
id_exact_query = request.GET.get('title_exact')
title_or_author_query = request.GET.get('title_or_author')
view_count_min = request.GET.get('view_count_min')
view_count_max = request.GET.get('view_count_max')
date_min = request.GET.get('date_min')
date_max = request.GET.get('date_max')
category = request.GET.get('category')
if is_valid_queryparam(title_contains_query):
qs = qs.filter(title__icontains=title_contains_query)
elif is_valid_queryparam(id_exact_query):
qs = qs.filter(id=id_exact_query)
elif is_valid_queryparam(title_or_author_query):
qs = qs.filter(Q(title__icontains=title_or_author_query) | Q(author__username__icontains=title_or_author_query)).distinct()
#...
if is_valid_queryparam(category) and category != 'Choose...':
qs = qs.filter(category__name=category)
context = {
'queryset': qs,
'categories': categories
}
return render(request, 'search/filter_form.html', context)
Мои шаблоны:
<form method="GET" action=".">
<div>
<input type="search" placeholder="Title contains..." name="title_contains">
</div>
<div>
<input type="search" placeholder="ID exact..." name="id_exact"/>
</div>
<div>
<input type="search" placeholder="Title or author..." name="title_or_author"/>
</div>
...
<div>
<label for="category">Category</label>
<select id="category" name="category">
<option selected>Choose...</option>
{% for category in categories %}
<option value="{{ category }}">{{ category }}</option>
{% endfor %}
</select>
</div>
<button type="submit">Search</button>
</form>
<div>
<ul>
{% for product in queryset %}
<li>
{{ product.title }}
<span>Author: {{ product.author.name }}</span>
<span>Category: {{ product.category }}</span>
...
</li>
<hr />
{% endfor %}
</ul>
</div>
Я думаю, что вы можете использовать Trigams для поиска похожих слов. См. также другие функции поиска.