Как интегрировать 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">« 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 »</a>
{% endif %}
</span>
</div>
{% endblock %}
Как и где мне сделать поисковые запросы для индексов, чтобы это работало с моим приложением? Нужно ли мне по-прежнему создавать новые модели и строить индексы на их основе или я могу добиться поиска без создания дополнительных моделей, поскольку я уже индексирую материал, как показано выше? Буду очень признателен за помощь