Comment indexer et interroger des données avec Haystack et Elasticsearch en Python

Meule de foin

Haystack est une bibliothèque Python qui fournit une recherche modulaire pour Django. Il comporte une API qui prend en charge différents types de recherche tels que Elasticsearch, Whoosh, Xapian et Solr..

Elasticsearch

Elasticsearch est un moteur de recherche populaire de Lucene capable de rechercher du texte intégral, développé en Java..

La recherche Google utilise la même approche d'indexation de leurs données. C'est pourquoi il est très facile de récupérer des informations à l'aide de quelques mots clés, comme indiqué ci-dessous..

Installer Django Haystack et Elasticsearch

La première étape consiste à installer Elasticsearch et à l’utiliser localement sur votre ordinateur. Elasticsearch nécessite Java, vous devez donc avoir Java installé sur votre machine.

Nous allons suivre les instructions du site Elasticsearch.

Téléchargez le fichier Elasticsearch 1.4.5 tar comme suit:

curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.4.5.tar.gz

Extrayez-le comme suit:

tar -xvf elasticsearch-1.4.5.tar.gz

Il créera ensuite un lot de fichiers et de dossiers dans votre répertoire actuel. Nous allons ensuite dans le répertoire bin comme suit:

cd elasticsearch-1.4.5 / bin

Démarrer Elasticsearch comme suit.

./ elasticsearch

Pour confirmer si l'installation est réussie, allez à http://127.0.0.1:9200/ et vous devriez voir quelque chose comme ça.

"name": "W3nGEDa", "cluster_name": "elasticsearch", "cluster_uuid": "ygpVDczbR4Ox5lzo0-w", "version": "numéro": "5.6.3", "build_hash": "1a2f265", "build_date": "2017-10-06T20: 33: 39.012Z", "build_snapshot": false, "lucene_version": "6.6.1", "slogan": "Vous savez, pour la recherche" 

Assurez-vous également d'avoir installé une botte de foin.

pip installer django-haystack

Créons notre projet Django. Notre projet permettra d’indexer tous les clients d’une banque, ce qui facilitera la recherche et la récupération de données en utilisant seulement quelques termes de recherche..

django-admin startproject Bank

Cette commande crée des fichiers qui fournissent des configurations pour les projets Django..

Créons une application pour les clients.

cd Bank python manage.py clients startapp

settings.py Les configurations

Afin d’utiliser Elasticsearch pour indexer notre contenu interrogeable, nous devrons définir un paramètre d’arrière-plan pour haystack dans notre projet. settings.py fichier. Nous allons utiliser Elasticsearch comme back-end.

HAYSTACK_CONNECTIONS est un paramètre requis et devrait ressembler à ceci:

HAYSTACK_CONNECTIONS = 'default': 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME': 'haystack',,

Dans le settings.py, nous allons également ajouter haystack et clients à la liste des applications installées.

INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles' , 'rest_framework', 'botte de foin', 'client']

Créer des modèles

Créons un modèle pour les clients. Dans clients / modèles.py, ajouter le code suivant.

from __future__ import unicode_literals de django.db import models # Créez vos modèles ici. customer_type = (("Actif", "Actif"), ("Inactif", "Inactif")) classe Customer (models.Model): id = models.IntegerField (clé_primaire = True) prénom_nom = modèles.CharField (longueur_max = 50 , null = False, blank = True) last_name = models.CharField (max_length = 50, null = False, blank = True) other_names = models.CharField (max_length = 50,) email = models.EmailField (max_length = 100, null = True, vide = True) phone = models.CharField (max_length = 30, null = False, vide = True) balance = models.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, choix = customer_type, default = "Active") address = models.CharField (max_length = 50, null = False, blank = False) def save (self, * args, ** kwargs): retourne super (client, auto) .save (* args, ** kwargs) def __unicode __ (self): retourne le format ": " (self.first_name, self.last_name) 

Enregistrez votre Client modèle en admin.py comme ça:

depuis django.contrib import admin depuis .models import Client # Enregistrez vos modèles ici. admin.site.register (Client) 

Créer une base de données et un super utilisateur

Appliquez vos migrations et créez un compte administrateur.

python manage.py migrer python manage.py crée un utilisateur 

Exécutez votre serveur et accédez à http: // localhost: 8000 / admin /. Vous devriez maintenant pouvoir y voir votre modèle client. Allez-y et ajoutez de nouveaux clients dans l'admin.

Données d'indexation

Pour indexer nos modèles, nous commençons par créer un SearchIndex. SearchIndex les objets déterminent quelles données doivent être placées dans l'index de recherche. Chaque type de modèle doit avoir un unique searchIndex.

SearchIndex Les objets sont le moyen utilisé par haystack pour déterminer quelles données doivent être placées dans l'index de recherche et pour gérer le flux de données. SearchIndex, nous allons hériter de la index.SearchIndex et index.Indexable, définir les champs avec lesquels nous voulons stocker nos données, et définir un get_model méthode.

Créons le CustomerIndex correspondre à notre Client la modélisation. Créer un fichier search_indexes.py dans le répertoire de l'application clients et ajoutez le code suivant.

from .models import Customer de la classe d'index d'importation haystack CustomerIndex (indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (document = True, use_template = True) prénom = indexes.CharField (modèle_attr = 'prénom_nom') last_name = .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',) solde = indexes .IntegerField (model_attr = 'balance', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') adresse = indexes.CharField (modèle_attr = 'adresse',) def get_model (auto): retour Client def index_queryset (self, using = None): retourne self.get_model (). objects.all () 

le EdgeNgramField est un champ dans la botte de foin SearchIndex qui empêche les correspondances incorrectes lorsque des parties de deux mots différents sont écrasées.

Cela nous permet d’utiliser le autocomplete fonction pour mener des requêtes. Nous utiliserons la saisie semi-automatique lorsque nous commencerons à interroger nos données..

document = True indique le champ principal pour la recherche dans. De plus, le  use_template = True dans le texte champ nous permet d'utiliser un modèle de données pour construire le document qui sera indexé.

Créons le modèle dans le répertoire de modèles de nos clients. À l'intérieur   recherche / indexes / clients / clients_text.txt, ajoutez ce qui suit:

object.first_name object.last_name object.other_names 

Réindexer les données

Maintenant que nos données sont dans la base de données, il est temps de les insérer dans notre index de recherche. Pour cela, lancez simplement ./manage.py reconstruction_index. Vous obtiendrez le nombre total de modèles traités et placés dans l'index..

Indexation de 20 clients 

Alternativement, vous pouvez utiliser RealtimeSignalProcessor, qui gère automatiquement les mises à jour / supprime pour vous. Pour l'utiliser, ajoutez ce qui suit dans la settings.py fichier.

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 

Interrogation des données

Nous allons utiliser un modèle de recherche et l'API Haystack pour interroger des données.

Modèle de recherche

Ajoutez les URL de la botte de foin à votre URLconf.

url (r '^ search /', include ('haystack.urls')), 

Créons notre modèle de recherche. Dans templates / search.html, ajouter le code suivant.

% block head%    % endblock% % block navbar%  % endblock% % block content% 
form.non_field_errors
form.as_p
% si requête%

Résultats

% pour le résultat dans page.object_list%

Prénom: result.first_name

Nom: result.last_name

Solde: result.balance

Email: result.email

Statut: result.customer_status

% vide %

Aucun résultat trouvé.

% endfor%
% fin si %
% endblock%

le page.object_list est une liste de Résultat de la recherche objets qui nous permet d'obtenir les objets de modèle individuels, par exemple, résultat.nom.

Votre structure de projet complète devrait ressembler à ceci:

Maintenant, lancez le serveur, allez à 127.0.0.1:8000/search/, et faire une recherche comme indiqué ci-dessous.

Une recherche de Albert donnera les résultats de tous les clients avec le nom Albert. Si aucun client n'a le nom Albert, la requête donnera des résultats vides. N'hésitez pas à jouer avec vos propres données.

API Haystack

Haystack a un SearchQuerySet classe conçue pour faciliter et rendre cohérent les recherches et l’itération des résultats. Une grande partie de la SearchQuerySet L'API est familier avec l'ORM de Django QuerySet.

Dans clients / views.py, ajoutez le code suivant:

from django.shortcuts import render rendu de rest_framework.decorators import (api_view, renderer_classes,) de .models import Customer de haystack.query import SearchQuerySet de rest_framework.response import Réponse # Créez vos vues ici. @api_view (['POST']) def client_recherche (demande): nom = request.data ['nom'] client = SearchQuerySet (). modèles (Client) .autocomplete (prénom_nom__startswith = nom) search_data = [] pour i dans le client : all_results = "first_name": i.first_name, "last_name": i.last_name, "balance": i.balance, "status": i.customer_status, created_data.append (all_results) return Response (search_data)

autocomplete est une méthode de raccourci pour effectuer une recherche à remplissage automatique. Il doit être exécuté sur des champs qui sont soit EdgeNgramField ou NgramField.

Au dessus Queryset, nous utilisons le contient méthode pour filtrer notre recherche pour récupérer uniquement les résultats contenant nos caractères définis. Par exemple, Al ne récupérera que les détails des clients qui contiennent Al. Notez que les résultats ne proviendront que des champs définis dans le menu fichier customer_text.txt.

Séparé de contient Champ de recherche, d'autres champs sont disponibles pour effectuer des requêtes, notamment:

  • contenu
  • contient
  • exact
  • gt
  • gte
  • lt
  • lte
  • dans
  • commence avec
  • se termine par
  • intervalle
  • flou

Conclusion

Une quantité énorme de données est produite à un moment donné dans les médias sociaux, la santé, les achats, etc. Une grande partie de ces données sont non structurées et dispersées. Elasticsearch peut être utilisé pour traiter et analyser ces données sous une forme compréhensible et utilisable..

Elasticsearch a également été largement utilisé pour la recherche de contenu, l'analyse de données et les requêtes. Pour plus d'informations, visitez les sites Haystack et Elasticsearch.