Сложная поисковая система 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 для поиска похожих слов. См. также другие функции поиска.

Вернуться на верх