Cum de a indexa și de a interoga date cu Haystack și elasticsearch în Python

căpiță

Haystack este o bibliotecă Python care oferă căutare modulară pentru Django. Dispune de un API care oferă suport pentru diferite capete de căutare, cum ar fi Elasticsearch, Whoosh, Xapian și Solr.

Elasticsearch

Elasticsearch este un popular motor de căutare Lucene capabil de căutare full-text și este dezvoltat în Java.

Căutarea Google utilizează aceeași abordare a indexării datelor și de aceea este foarte ușor să preluați orice informații cu doar câteva cuvinte cheie, după cum se arată mai jos.

Instalați Django Haystack și Elasticsearch

Primul pas este să obțineți funcția Elasticsearch la mașina locală. Elasticsearch necesită Java, deci trebuie să aveți instalat Java pe mașina dvs..

Vom urma instrucțiunile de pe site-ul Elasticsearch.

Descărcați gudronul Elasticsearch 1.4.5 după cum urmează:

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

Extrageți-l după cum urmează:

tar -xvf elasticsearch-1.4.5.tar.gz

Acesta va crea apoi un lot de fișiere și foldere din directorul dvs. curent. Apoi intram in directorul bin dupa cum urmeaza:

cd elasticsearch-1.4.5 / bin

Porniți Elasticsearch după cum urmează.

./ elasticsearch

Pentru a confirma dacă sa instalat cu succes, accesați http://127.0.0.1:9200/ și ar trebui să vedeți ceva de genul acesta.

"nume": "W3nGEDa", "cluster_name": "elasticsearch", "cluster_uuid": "ygpVDczbR4OI5sx5lzo0-w", "versiune": "număr": "5.6.3", "build_hash": "1a2f265"; "build_date": "2017-10-06T20: 33: 39.012Z", "build_snapshot": false, "lucene_version": "6.6.1", "slogan": "Știți, pentru căutare" 

Asigurați-vă că aveți, de asemenea, instalat haystack.

pip instalați django-haystack

Să creăm proiectul nostru Django. Proiectul nostru va putea să indexeze toți clienții dintr-o bancă, facilitând căutarea și preluarea datelor folosind doar câțiva termeni de căutare.

django-admin startproject Bank

Această comandă creează fișiere care oferă configurații pentru proiectele Django.

Să creăm o aplicație pentru clienți.

cd Banca python manage.py startapp clienți

settings.py Configurațiile

Pentru a utiliza Elasticsearch pentru a indexa conținutul care poate fi căutat, va trebui să definim o setare de back-end pentru stackul de hay în proiectul nostru settings.py fişier. Vom folosi Elasticsearch ca pe un back-end.

HAYSTACK_CONNECTIONS este o setare cerută și ar trebui să arate astfel:

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

În cadrul settings.py, vom adăuga, de asemenea, fânul de carne și clienții la lista de aplicații instalate.

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

Creați modele

Să creăm un model pentru clienți. În clienților / modele.py, adăugați următorul cod.

din __future__ import unicode_literals de la modelele de import django.db # Creați-vă modelele aici. client_type = (("activ", "activ"), (inactiv), "inactiv") clasa Client (models.Model): id = models.IntegerField (primary_key = True) first_name = models.CharField (max_length = , null = False, martor = Adevărat) last_name = models.CharField (max_length = 50, null = Adevărat, martor = adevărat) phone = models.CharField (max_length = 30, null = False, default = "Active") adresa = modele.CharField (max_length = 50, null = False, blank = False) def save (self, ** kwargs) def __unicode __ (auto): întoarcere ": ". format (auto.first_name, auto.last_name) 

Înregistrați-vă Client model în admin.py asa:

de la import django.contrib admin de la .models import Client # Înregistrați-vă modelele aici. admin.site.register (Client) 

Creați baza de date și utilizatorul super

Aplicați migrațiile și creați un cont de administrator.

python manage.py migrează python manage.py createsuperuser 

Rulați serverul și navigați la http: // localhost: 8000 / admin /. Acum ar trebui să puteți vedea modelul dvs. de client acolo. Continuați și adăugați noi clienți în admin.

Indexarea datelor

Pentru a indexa modelele noastre, începem prin crearea unui SearchIndex. SearchIndex obiectele determină ce date ar trebui plasate în indexul de căutare. Fiecare tip de model trebuie să aibă un model unic searchIndex.

SearchIndex obiectele sunt modul în care haystack-ul determină ce date trebuie plasate în indexul de căutare și gestionează fluxul de date. SearchIndex, vom moșteni de la indexes.SearchIndex și indexes.Indexable, definiți câmpurile cu care vrem să stocăm datele noastre și să definim a get_model metodă.

Să creăm CustomerIndex pentru a corespunde cu noastre Client modelare. Creați un fișier search_indexes.py în directorul de aplicații pentru clienți și adăugați următorul cod.

din importul de module. Clientul din indexul de import al haystack-ului, indexul CustomerIndex (indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (document = True, use_template = True) first_name = indexes.CharField (model_attr = 'first_name') 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 = .IntegerField (model_attr = 'echilibru', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') adresa = indexes.CharField (model_attr = 'adresa') def get_model (self) (self, using = Niciuna): return self.get_model () objects.all () 

 EdgeNgramField este un câmp în haystack SearchIndex care împiedică potrivirile incorecte atunci când părți ale a două cuvinte diferite sunt împrăștiate împreună.

Ne permite să folosim Completare automată caracteristică pentru a efectua interogări. Vom folosi autocomplete atunci când vom începe să interogăm datele noastre.

Document = Adevărat indică câmpul principal pentru căutarea în interiorul. În plus,  use_template = Adevărat în text câmpul ne permite să folosim un șablon de date pentru a construi documentul care va fi indexat.

Să creăm șablonul în directorul de șabloane al clienților noștri. Interior   căutare / indici / clienti / customers_text.txt, adăugați următoarele:

object.first_name object.last_name object.other_names 

Reindex Data

Acum, că datele noastre sunt în baza de date, este timpul să le punem în indexul nostru de căutare. Pentru a face acest lucru, pur și simplu alerga ./manage.py rebuild_index. Veți obține totalul a câte modele au fost procesate și plasate în index.

Indexarea a 20 de clienți 

Alternativ, puteți utiliza RealtimeSignalProcessor, care gestionează automat actualizările / ștergerile pentru dvs. Pentru ao folosi, adăugați următoarele în settings.py fişier.

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 

Interogarea datelor

Vom folosi un șablon de căutare și API-ul Haystack pentru a interoga datele.

Șablon de căutare

Adăugați urnele de haystack în URLconf.

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

Să creăm șablonul nostru de căutare. În template-uri / search.html, adăugați următorul cod.

% block head%    % endblock% % bloc% navbar%  % endblock% % conținutul blocului% 
form.non_field_errors
form.as_p
% dacă interogarea%

Rezultate

% pentru rezultat în page.object_list%

Prenume: result.first_name

Nume de familie: result.last_name

Sold: result.balance

Email: result.email

Stare: result.customer_status

% empty%

Nici un rezultat gasit.

% endfor%
% endif%
% endblock%

page.object_list este o listă de Rezultatul căutării obiecte care ne permit să obținem obiectele modelului individual, de exemplu, result.first_name.

Structura completă a proiectului dvs. ar trebui să arate astfel:

Acum rulați serverul, mergeți la 127.0.0.1:8000/search/, și faceți o căutare după cum se arată mai jos.

O căutare a Albert va da rezultate tuturor clienților cu numele Albert. Dacă niciun client nu are numele Albert, atunci interogarea va da rezultate goale. Simțiți-vă liber să vă jucați cu propriile date.

Haystack API

Haystack are o SearchQuerySet clasa care este concepută pentru a face mai ușoară și coerentă efectuarea căutărilor și iterarea rezultatelor. O mare parte din SearchQuerySet API este familiarizat cu ORM-ul lui Django setul de interogări.

În clienții / views.py, adăugați următorul cod:

de la django.shortcuts import render de la rest_framework.decorators import (api_view, renderer_classes,) de la .models import Client de la haystack.query import SearchQuerySet de la rest_framework.response import Response # Creați vizualizările dvs. aici. @api_view (['POST']) def search_customer (cerere): name = request.data ['name'] customer = SearchQuerySet : all_results = "first_name": i.first_name, "last_name": i.last_name, "balance": i.balance, "status": i.customer_status, searched_data.append (all_results)

Completare automată este o metodă de comandă rapidă pentru a efectua o căutare automată completă. Trebuie să fie executat împotriva câmpurilor care sunt fie EdgeNgramField sau NgramField.

În cele de mai sus set de interogări, noi folosim conține metoda de filtrare a căutării noastre pentru a prelua numai rezultatele care conțin caracterele definite. De exemplu, Al va prelua numai detaliile clienților care conțin Al. Rețineți că rezultatele vor veni numai din câmpurile definite în secțiunea client_text.txt fișier.

În afară de conține Căutarea câmpului, există alte câmpuri disponibile pentru a efectua interogări, inclusiv:

  • conţinut
  • conține
  • exact
  • gt
  • GTE
  • lt
  • lte
  • în
  • incepe cu
  • se termină cu
  • gamă
  • pufos

Concluzie

O cantitate imensă de date este produsă la un moment dat în mass-media sociale, sănătate, cumpărături și alte sectoare. O mare parte din aceste date sunt nestructurate și împrăștiate. Aplicația elastică poate fi utilizată pentru a procesa și analiza aceste date într-o formă care poate fi înțeleasă și consumată.

Elasticsearch a fost de asemenea utilizat extensiv pentru căutarea de conținut, analiza datelor și interogări. Pentru mai multe informații, vizitați site-urile Haystack și Elasticsearch.

Cod