Haystack è una libreria Python che fornisce la ricerca modulare di Django. È dotato di un'API che fornisce supporto per diversi siti di ricerca come Elasticsearch, Whoosh, Xapian e Solr.
Elasticsearch è un popolare motore di ricerca Lucene in grado di eseguire ricerche full-text ed è sviluppato in Java.
La ricerca di Google utilizza lo stesso approccio per l'indicizzazione dei dati, ed è per questo che è molto facile recuperare qualsiasi informazione con poche parole chiave, come mostrato di seguito.
Il primo passo è fare in modo che Elasticsearch sia installato localmente sul tuo computer. Elasticsearch richiede Java, quindi è necessario aver installato Java sul tuo computer.
Seguiremo le istruzioni dal sito Elasticsearch.
Scarica il tar di Elasticsearch 1.4.5 come segue:
curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.4.5.tar.gz
Estrai come segue:
tar -xvf elasticsearch-1.4.5.tar.gz
Creerà quindi un gruppo di file e cartelle nella directory corrente. Entriamo quindi nella directory bin come segue:
cd elasticsearch-1.4.5 / bin
Avvia Elasticsearch come segue.
./ elasticsearch
Per confermare se è stato installato correttamente, vai a http://127.0.0.1:9200/, e dovresti vedere qualcosa del genere.
"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": "Sai, per la ricerca"
Assicurati anche di avere haystack installato.
pip installa django-haystack
Creiamo il nostro progetto Django. Il nostro progetto sarà in grado di indicizzare tutti i clienti in una banca, semplificando la ricerca e il recupero dei dati utilizzando solo pochi termini di ricerca.
django-admin startproject Bank
Questo comando crea file che forniscono configurazioni per i progetti Django.
Creiamo un'app per i clienti.
cd Bank python manage.py clienti startapp
settings.py
configurazioniPer utilizzare Elasticsearch per indicizzare i nostri contenuti ricercabili, è necessario definire un'impostazione back-end per il pagliaio nel nostro progetto settings.py
file. Utilizzeremo Elasticsearch come back end.
HAYSTACK_CONNECTIONS
è un'impostazione richiesta e dovrebbe assomigliare a questa:
HAYSTACK_CONNECTIONS = 'default': 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.1.19200/', 'INDEX_NAME': 'haystack',,
All'interno del settings.py
, aggiungeremo anche pagliaio e clienti alla lista di app installate
.
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles' , 'rest_framework', 'haystack', 'customer']
Creiamo un modello per i clienti. Nel clienti / modelli.
py
, aggiungi il seguente codice.
da __future__ import unicode_literals dai modelli di importazione django.db # Crea i tuoi modelli qui. customer_type = (("Attivo", "Attivo"), ("Inattivo", "Inattivo")) classe Cliente (models.Model): id = models.IntegerField (primary_key = True) first_name = models.CharField (max_length = 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, blank = True) phone = models.CharField (max_length = 30, null = False, blank = True) balance = models.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, choices = customer_type, default = "Attivo") address = models.CharField (max_length = 50, null = False, blank = False) def save (self, * args, ** kwargs): return super (Customer, self) .save (* args, ** kwargs) def __unicode __ (self): restituisce ": ". format (self.first_name, self.last_name)
Registra il tuo Cliente
modello in admin.py
come questo:
da django.contrib import admin da .models import Customer # Registra qui i tuoi modelli. admin.site.register (Cliente)
Applica le tue migrazioni e crea un account amministratore.
python manage.py migrate python manage.py createsuperuser
Esegui il tuo server e vai a http: // localhost: 8000 / admin /. Ora dovresti essere in grado di vedere il tuo modello di cliente lì. Vai avanti e aggiungi nuovi clienti nell'amministratore.
Per indicizzare i nostri modelli, iniziamo creando un searchindex
. searchindex
gli oggetti determinano quali dati devono essere inseriti nell'indice di ricerca. Ogni tipo di modello deve avere un unico searchindex
.
searchindex
gli oggetti sono il modo in cui il pagliaio determina quali dati devono essere inseriti nell'indice di ricerca e gestisce il flusso di dati. Per costruire un searchindex
, erediteremo dal indexes.SearchIndex
e indexes.Indexable
, definire i campi con i quali vogliamo memorizzare i nostri dati e definire a get_model
metodo.
Creiamo il CustomerIndex
per corrispondere al nostro Cliente
modellazione. Crea un file search_indexes.py
nella directory dell'app clienti e aggiungi il seguente codice.
.models import Cliente dalla classe degli indici di importazione pagliaio 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): return Customer def index_queryset (self, using = None): return self.get_model (). objects.all ()
Il EdgeNgramField
è un campo nel pagliaio searchindex
che impedisce corrispondenze errate quando parti di due parole diverse vengono schiacciate insieme.
Ci permette di usare il completamento automatico
funzione per condurre le domande. Useremo il completamento automatico quando inizieremo a interrogare i nostri dati.
documento = True
indica il campo principale per la ricerca all'interno. Inoltre, il use_template = True
nel testo
campo ci consente di utilizzare un modello di dati per creare il documento che verrà indicizzato.
Creiamo il modello all'interno della directory dei modelli dei nostri clienti. Dentro Ricerca / indici / clienti / customers_text.txt
, aggiungere il seguente:
object.first_name object.last_name object.other_names
Ora che i nostri dati sono nel database, è ora di inserirlo nel nostro indice di ricerca. Per farlo, basta correre ./manage.py rebuild_index
. Otterrai i totali di quanti modelli sono stati elaborati e inseriti nell'indice.
Indicizzazione di 20 clienti
In alternativa, puoi usare RealtimeSignalProcessor
, che gestisce automaticamente gli aggiornamenti / eliminazioni per te. Per usarlo, aggiungi quanto segue in settings.py
file.
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
Utilizzeremo un modello di ricerca e l'API Haystack per interrogare i dati.
Modello di ricerca
Aggiungi gli URL del pagliaio al tuo URLconf.
url (r '^ cerca /', include ('haystack.urls'))),
Creiamo il nostro modello di ricerca. Nel templates / search.html
, aggiungi il seguente codice.
% block head% % endblock% % block navbar% % endblock% % block content%% endblock%
Il page.object_list
è una lista di Risultato della ricerca
oggetti che ci permettono di ottenere i singoli oggetti del modello, per esempio, result.first_name
.
La tua struttura di progetto completa dovrebbe essere simile a questa:
Ora esegui server, vai a 127.0.0.1:8000/search/
, e fai una ricerca come mostrato sotto.
Una ricerca di Albert
darà i risultati di tutti i clienti con il nome Albert
. Se nessun cliente ha il nome Albert, la query restituirà risultati vuoti. Sentiti libero di giocare con i tuoi dati.
Haystack ha un SearchQuerySet
classe progettata per rendere più semplice e coerente la ricerca e l'iterazione dei risultati. Gran parte del SearchQuerySet
API ha familiarità con ORM di Django QuerySet
.
Nel clienti / views.py
, aggiungi il seguente codice:
da django.shortcuts importare il rendering da rest_framework.decorators import (api_view, renderer_classes,) da .models import Cliente da haystack.query import SearchQuerySet da rest_framework.response import Response # Crea qui le tue viste. @api_view (['POST']) def search_customer (request): name = request.data ['name'] customer = SearchQuerySet (). models (Customer) .autocomplete (first_name__startswith = name) searched_data = [] per i in customer : all_results = "first_name": i.first_name, "last_name": i.last_name, "balance": i.balance, "status": i.customer_status, searched_data.append (all_results) return Response (cercato_data)
completamento automatico
è un metodo di scelta rapida per eseguire una ricerca di completamento automatico. Deve essere eseguito contro i campi che sono entrambi EdgeNgramField
o NgramField
.
In quanto sopra set di query
, stiamo usando il contiene
metodo per filtrare la nostra ricerca per recuperare solo i risultati che contengono i nostri caratteri definiti. Per esempio, Al
recupererà solo i dettagli dei clienti che contengono Al
. Si noti che i risultati arriveranno solo da campi che sono stati definiti in file customer_text.txt
.
Oltre al contiene
Ricerca campi, ci sono altri campi disponibili per eseguire query, tra cui:
Un'enorme quantità di dati viene prodotta in qualsiasi momento nei social media, nella sanità, negli acquisti e in altri settori. Gran parte di questi dati non è strutturata e dispersa. Elasticsearch può essere utilizzato per elaborare e analizzare questi dati in una forma che può essere compresa e consumata.
Elasticsearch è stato anche ampiamente utilizzato per la ricerca di contenuti, l'analisi dei dati e le query. Per ulteriori informazioni, visitare i siti Haystack ed Elasticsearch.