Indizieren und Abfragen von Daten mit Heuhaufen und Elasticsearch in Python

Heuhaufen

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

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.

Installieren Sie Django Haystack und Elasticsearch

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 Konfigurationen

Um 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']

Modelle erstellen

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) 

Datenbank und Super User erstellen

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.

Daten indizieren

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 

Daten neu indexieren

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' 

Daten abfragen

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% 
form.non_field_errors
form.as_p
% if Abfrage%

Ergebnisse

% für das Ergebnis in page.object_list%

Vorname: result.wunschname

Nachname: result.lastname

Kontostand: result.balance

E-Mail: result.email

Status: result.customer_status

% empty%

keine Ergebnisse gefunden.

% endfor%
% endif%
% 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-API

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:

  • Inhalt
  • enthält
  • genau
  • gt
  • gte
  • Es ist
  • lte
  • im
  • beginnt mit
  • endet mit
  • Angebot
  • unscharf

Fazit

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.