Come indicizzare e interrogare i dati con Haystack ed Elasticsearch in Python

Pagliaio

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

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.

Installa Django Haystack ed Elasticsearch

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 configurazioni

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

Crea modelli

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) 

Crea database e Super utente

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.

Dati di indicizzazione

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.SearchIndexindexes.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 

Reindex Data

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' 

Dati di query

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% 
form.non_field_errors
form.as_p
% se query%

risultati

% per il risultato in page.object_list%

Nome: result.first_name

Cognome: result.last_name

Saldo: result.balance

Email: result.email

Stato: result.customer_status

% vuoto %

nessun risultato trovato.

% endfor%
% finisci se %
% 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.

API Haystack

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:

  • soddisfare
  • contiene
  • esatto
  • gt
  • gte
  • lt
  • lte
  • nel
  • inizia con
  • finisce con
  • gamma
  • sfocato

Conclusione

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.