Как интегрировать Elasticsearch DSL Django для выполнения запросов с переднего плана

Я пытаюсь реализовать функции поиска в моем django проекте, вот как я храню данные в Elasticsearch, после скраппинга, он мгновенно сохраняет материал в индексы. Определил необходимые параметры в settings.py .

es_client = Elasticsearch(['http://127.0.0.1:9200'])

    
    doc = {
                "date": time.strftime("%Y-%m-%d"),
                "current_url": input_url,
                "depth": depth,
                "content": text     
                }

    res = es_client.index(index=str(cluster_id), doc_type="_doc", body=doc)
    print(res["result"])

Это мой models.py

from django.conf.urls import url
from django.db import models
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify
from spider.spider.spiders.crawler import begin_crawl

'''
Cluster
One user can have multiple clusters
So an one-to-many relationship has been created
'''
class Cluster(models.Model):
    # Once the user deletes his account, clusters related to his account will be deleted
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='clusters')
    title = models.CharField(max_length=100)
    description = models.TextField(null=True, blank=True, default='Creating a Search Cluster for advanced search')
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(null=True, blank=True)

    class Meta:
        # Default ordering is set to date_created
        ordering = ['date_created']

    def __str__(self):
        return self.title
    
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Cluster, self).save(*args, **kwargs)

'''
Each Cluster can have multiple urls
So an one-to-many-relationship has been created 
'''
output_preference = (
        ('text', 'Textual Data'),
        ('pdf', 'PDF')
    )

class Url(models.Model):
    # Once a Cluster is deleted, all the urls related to that cluster will be deleted
    cluster = models.ForeignKey(Cluster, on_delete=models.CASCADE, null=True, blank=True, related_name='urls')
    cluster_url = models.URLField(max_length=200)
    depth = models.PositiveIntegerField()
    output_type = models.CharField(max_length=20, choices=output_preference)
    date_added = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(null=True, blank=True)
    is_crawled= models.BooleanField(default=False)

    class Meta:
        # Default ordering is set to date_created
        ordering = ['date_added']

    def __str__(self):
        return self.cluster_url
    
    def save(self, *args, **kwargs):
        self.slug = slugify(self.cluster)
        super(Url, self).save(*args, **kwargs)

Это мой views.py, просто сохранил здесь поисковые представления без других вещей

# Cluster-Search view
class SearchDetail(LoginRequiredMixin, DetailView):
    model = Cluster
    context_object_name = 'cluster'
    template_name = 'base_app/cluster_search.html'
    query_pk_and_slug = True
    pagination = 10

    def search(request):
        search_text = request.GET.get('q')
        if search_text:
            pass
        else:
            #results = ''
            pass
        return render(request, 'base_app/cluster_search.html', {'Cluster': Cluster})   

Это мой шаблон поиска

{% extends "account/base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block head_title %}{% trans "Search" %}{% endblock %}

{% block content %}
<a href="{% url 'clusters' %}">Go Back</a>

<P style="font-size:17px;">You are searching in {{cluster.title}}</P>

<form method="get">
    <button class="btn btn-primary">Search</button>
    <input id="q" name="q" type="text" placeholder="search text">
</form>

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

{% endblock %}

Как и где мне сделать поисковые запросы для индексов, чтобы это работало с моим приложением? Нужно ли мне по-прежнему создавать новые модели и строить индексы на их основе или я могу добиться поиска без создания дополнительных моделей, поскольку я уже индексирую материал, как показано выше? Буду очень признателен за помощь

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