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 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..
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 configurationsAfin 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é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)
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.
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
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'
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%% 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.
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:
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.