Haystack ist eine Python-Bibliothek, die die modulare Suche nach Django ermöglicht. Es verfügt über eine API, die verschiedene Back-End-Funktionen wie Elasticsearch, Whoosh, Xapian und Solr unterstützt.
Elasticsearch ist eine beliebte Lucene-Suchmaschine, die Volltextsuche unterstützt und in Java entwickelt wurde.
Die Google-Suche verwendet dieselbe Methode zur Indizierung ihrer Daten. Aus diesem Grund ist es sehr einfach, Informationen mit nur wenigen Keywords abzurufen, wie unten gezeigt.
Der erste Schritt besteht darin, Elasticsearch lokal auf Ihrem Computer zu installieren. Elasticsearch erfordert Java, daher muss Java auf Ihrem Computer installiert sein.
Wir befolgen die Anweisungen auf der Elasticsearch-Site.
Laden Sie den Elasticsearch 1.4.5 tar wie folgt herunter:
curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.4.5.tar.gz
Extrahieren Sie es wie folgt:
tar -xvf elasticsearch-1.4.5.tar.gz
Es erstellt dann einen Stapel von Dateien und Ordnern in Ihrem aktuellen Verzeichnis. Wir gehen dann wie folgt in das bin-Verzeichnis:
cd elasticsearch-1.4.5 / bin
Starten Sie Elasticsearch wie folgt.
./ elasticsearch
Um zu überprüfen, ob die Installation erfolgreich abgeschlossen wurde, rufen Sie die Website http://127.0.0.1:9200/ auf. In diesem Fall sollte etwas angezeigt werden.
"name": "W3nGEDa", "cluster_name": "elasticsearch", "cluster_uuid": "ygpVDczbR4OI5sx5lzo0-w", "version": "number": "5.6.3", "build_hash": "1a2f265", "build_date": "2017-10-06T20: 33: 39.012Z", "build_snapshot": false, "lucene_version": "6.6.1", "tagline": "Sie wissen, für die Suche"
Stellen Sie sicher, dass Sie auch Heuhaufen installiert haben.
pip install django-haystack
Lassen Sie uns unser Django-Projekt erstellen. Unser Projekt wird in der Lage sein, alle Kunden in einer Bank zu indizieren, so dass Daten mit wenigen Suchbegriffen leicht gesucht und abgerufen werden können.
django-admin startprojekt bank
Dieser Befehl erstellt Dateien, die Konfigurationen für Django-Projekte bereitstellen.
Lassen Sie uns eine App für Kunden erstellen.
cd Bank python manage.py startapp-Kunden
einstellungen.py
KonfigurationenUm Elasticsearch zum Indizieren unserer durchsuchbaren Inhalte verwenden zu können, müssen wir in unserem Projekt eine Back-End-Einstellung für Heuhaufen definieren einstellungen.py
Datei. Wir werden Elasticsearch als unser Backend verwenden.
HAYSTACK_CONNECTIONS
ist eine erforderliche Einstellung und sollte so aussehen:
HAYSTACK_CONNECTIONS = 'default': 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME',,
Innerhalb des einstellungen.py
, Wir werden auch Heuhaufen und Kunden zur Liste hinzufügen installierte Apps
.
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles' , 'rest_framework', 'haystack', 'customer']
Lassen Sie uns ein Modell für Kunden erstellen. Im Kunden / Modelle.
py
, Fügen Sie den folgenden Code hinzu.
von __future__ importieren unicode_literals von django.db import models # Erstellen Sie hier Ihre Modelle. customer_type = (("Aktiv", "Aktiv"), ("Inaktiv", "Inaktiv")) Klasse Kunde (Modelle.Modell): id = models.IntegerField (primary_key = True) first_name = models.CharField (max_length = 50) , null = falsch, leer = wahr) last_name = models.CharField (max_length = 50, null = falsch, leer = true) other_names = models.CharField (max_length = 50,) email = models.EmailField (max_length = 100, null = True, leer = True) phone = models.CharField (max_length = 30, null = False, blank = true) balance = models.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, auswahl = customer_type, default = "Active") address = models.CharField (max_length = 50, null = False, leer = False) def save (self, * args, ** kwargs): return super (Kunde, self) .save (* args, ** kwargs) def __unicode __ (self): Rückgabe des Formats ": ". (self.first_name, self.ast_name)
Registrieren Sie Ihre Kunde
Modell in admin.py
so was:
von django.contrib import admin von .models import Kunde # Registrieren Sie Ihre Modelle hier. admin.site.register (Kunde)
Wenden Sie Ihre Migrationen an und erstellen Sie ein Administratorkonto.
python manage.py migrieren python manage.py erstellt einen Superuser
Führen Sie Ihren Server aus und navigieren Sie zu http: // localhost: 8000 / admin /. Sie sollten jetzt Ihr Kundenmodell dort sehen können. Fügen Sie neue Kunden hinzu.
Um unsere Modelle zu indizieren, erstellen wir zunächst eine SearchIndex
. SearchIndex
Objekte bestimmen, welche Daten im Suchindex platziert werden sollen. Jeder Modelltyp muss eindeutig sein searchIndex
.
SearchIndex
Heuhaufen bestimmt anhand von Objekten, in welchen Daten der Suchindex platziert werden soll, und verwaltet den Datenfluss SearchIndex
, wir werden von dem erben indexes.SearchIndex
und indexes.Indexable
, definieren Sie die Felder, mit denen wir unsere Daten speichern möchten, und definieren Sie a get_model
Methode.
Lass uns die erstellen CustomerIndex
unseren entsprechen Kunde
Modellieren. Erstellen Sie eine Datei search_indexes.py
im Kunden-App-Verzeichnis und fügen Sie den folgenden Code hinzu.
von .models import Customer aus Haystack importiert die Indexklasse CustomerIndex (indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (document = True, use_template = True) first_name = indexes.CharField (model_attr = 'first_name') last_name = indexes .CharField (model_attr = 'last_name') other_names = indexes.CharField (model_attr = 'other_names') email = indexes.CharField (model_attr = 'email',) phone = indexes.CharField (model_attr = 'phone',) balance = indexes .IntegerField (model_attr = 'balance', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') address = indexes.CharField (model_attr = 'address',) def get_model (self): Rückgabewert def_index_queryset (self, using = None): return self.get_model (). objects.all ()
Das EdgeNgramField
ist ein Feld im Heuhaufen SearchIndex
Dies verhindert falsche Übereinstimmungen, wenn Teile von zwei verschiedenen Wörtern zusammengemischt werden.
Es erlaubt uns die Verwendung der Autovervollständigung
Funktion, um Abfragen durchzuführen. Wir werden Autocomplete verwenden, wenn wir mit der Abfrage unserer Daten beginnen.
document = True
gibt das Hauptfeld für die Suche innerhalb an. Zusätzlich die use_template = True
in dem Text
Mit diesem Feld können wir eine Datenvorlage verwenden, um das zu indexierende Dokument zu erstellen.
Erstellen wir die Vorlage in unserem Kundenvorlagenverzeichnis. Innerhalb suche / indexes / customers / customers_text.txt
, Folgendes hinzufügen:
object.first_name object.last_name object.other_names
Jetzt, da sich unsere Daten in der Datenbank befinden, ist es Zeit, sie in unseren Suchindex aufzunehmen. Dazu einfach laufen ./manage.py rebuild_index
. Sie erhalten Gesamtzahlen darüber, wie viele Modelle verarbeitet und in den Index aufgenommen wurden.
Indizierung von 20 Kunden
Alternativ können Sie verwenden Echtzeitsignalprozessor
, die automatisch Updates / Löschungen für Sie erledigt. Um es zu verwenden, fügen Sie Folgendes in das Feld ein einstellungen.py
Datei.
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
Wir werden eine Suchvorlage und die Haystack-API zum Abfragen von Daten verwenden.
Vorlage suchen
Fügen Sie der URLconf die Heuhaufen-URLs hinzu.
URL (r '^ search /', include ('haystack.urls')),
Lassen Sie uns unsere Suchvorlage erstellen. Im templates / search.html
, Fügen Sie den folgenden Code hinzu.
% block head% % endblock% % block navbar% % endblock% % block content%% endblock%
Das page.object_list
ist eine Liste von Suchergebnis
Objekte, mit denen wir zum Beispiel die einzelnen Modellobjekte erhalten können, result.wird_name
.
Ihre komplette Projektstruktur sollte ungefähr so aussehen:
Führen Sie nun den Server aus, gehen Sie zu 127.0.0.1:8000/search/
, und führen Sie eine Suche wie unten gezeigt durch.
Eine Suche nach Albert
gibt die Ergebnisse aller Kunden mit dem Namen aus Albert
. Wenn kein Kunde den Namen Albert hat, gibt die Abfrage leere Ergebnisse aus. Fühlen Sie sich frei, mit Ihren eigenen Daten zu spielen.
Heuhaufen hat eine SearchQuerySet
Klasse, die das Durchführen von Suchen und das Durchlaufen von Ergebnissen vereinfacht und konsistent macht. Viel von der SearchQuerySet
Die API ist mit Djangos ORM vertraut QuerySet
.
Im Kunden / Ansichten.py
, Fügen Sie den folgenden Code hinzu:
import django.shortcuts import render von rest_framework.decorators import (api_view, renderer_classes,) von .models import Customer aus haystack.query importieren SearchQuerySet von rest_framework.response import Antwort # Erstellen Sie Ihre Ansichten hier. @api_view (['POST']) def search_customer (request): name = request.data ['name'] customer = SearchQuerySet (). models (Customer) .autocomplete (first_name__startswith = name) search_data = [] für i im Kunden : all_results = "first_name": i.first_name, "last_name": i.last_name, "balance": i.balance, "status": i.customer_status, search_data.append (alle_Ergebnisse) return Response (gesuchte_Daten)
Autovervollständigung
ist eine Verknüpfungsmethode zum Durchführen einer automatischen Vervollständigung der Suche. Es muss gegen Felder laufen, die entweder sind EdgeNgramField
oder NgramField
.
In obigem Queryset
, wir benutzen die enthält
Methode zum Filtern unserer Suche, um nur die Ergebnisse abzurufen, die unsere definierten Zeichen enthalten. Zum Beispiel, Al
ruft nur die Details der Kunden auf, die enthalten Al
. Beachten Sie, dass die Ergebnisse nur aus Feldern stammen, die in definiert wurden customer_text.txt -Datei
.
Neben dem enthält
Bei der Feldsuche stehen weitere Felder zum Durchführen von Abfragen zur Verfügung, darunter:
Zu jeder Zeit wird eine riesige Datenmenge in den Bereichen Social Media, Gesundheit, Einkaufen und anderen Bereichen produziert. Viele dieser Daten sind unstrukturiert und zerstreut. Elasticsearch kann verwendet werden, um diese Daten in einer Form zu verarbeiten und zu analysieren, die verstanden und genutzt werden kann.
Elasticsearch wurde auch umfangreich für die Suche nach Inhalten, Datenanalysen und Abfragen verwendet. Weitere Informationen finden Sie auf den Seiten Heuhaufen und Elasticsearch.