Hvordan indeksere og spørre data med Haystack og Elasticsearch i Python

Høystakk

Haystack er et Python-bibliotek som tilbyr modulær søk etter Django. Den har en API som gir støtte for ulike søkebakender, som Elasticsearch, Whoosh, Xapian og Solr.

Elasticsearch

Elasticsearch er en populær Lucene-søkemotor som kan søke i fulltekst, og det er utviklet i Java.

Google-søk bruker samme metode for å indeksere dataene sine, og derfor er det veldig enkelt å hente informasjon med bare noen få søkeord, som vist nedenfor.

Installer Django Haystack og Elasticsearch

Det første trinnet er å få Elasticsearch opp og kjører lokalt på maskinen din. Elasticsearch krever Java, så du må ha Java installert på maskinen din.

Vi skal følge instruksjonene fra Elasticsearch-siden.

Last ned Elasticsearch 1.4.5 tar som følger:

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

Trekk det ut som følger:

tar -xvf elasticsearch-1.4.5.tar.gz

Det vil da lage en gruppe filer og mapper i din nåværende katalog. Vi går så inn i bin-katalogen som følger:

cd elasticsearch-1.4.5 / bin

Start Elasticsearch som følger.

./ elasticsearch

For å bekrefte om den har installert, kan du gå til http://127.0.0.1:9200/, og du bør se noe sånt.

"navn": "W3nGEDa", "cluster_name": "elasticsearch", "cluster_uuid": "ygpVDczbR4OI5sx5lzo0-w", "versjon": "nummer": "5.6.3", "build_hash": "1a2f265" "build_date": "2017-10-06T20: 33: 39.012Z", "build_snapshot": false, "lucene_version": "6.6.1", "tagline": "Du vet, for søk" 

Sørg for at du også har haystack installert.

pip installere django-haystack

La oss lage vårt Django-prosjekt. Vårt prosjekt vil kunne indeksere alle kundene i en bank, noe som gjør det enkelt å søke og hente data ved å bruke bare noen få søkeord.

django-admin startproject Bank

Denne kommandoen lager filer som gir konfigurasjoner for Django-prosjekter.

La oss lage en app for kunder.

cd bank python manage.py startapp kunder

settings.py konfigurasjoner

For å kunne bruke Elasticsearch til å indeksere vårt søkbare innhold, må vi definere en back-end-innstilling for haystack i prosjektets settings.py fil. Vi skal bruke Elasticsearch som vår bakside.

HAYSTACK_CONNECTIONS er en nødvendig innstilling og skal se slik ut:

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

Innen settings.py, Vi skal også legge til haystack og kunder til listen over installerte apper.

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

Opprett modeller

La oss lage en modell for kunder. I kunder / modeller.py, legg til følgende kode.

fra __future__ importer unicode_literals fra django.db importmodeller # Lag dine modeller her. customer_type = ("Aktiv", "Aktiv"), ("Inaktiv", "Inaktiv")) klasse Kunde (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.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, valg = customer_type, default = "Active") adresse = models.CharField (max_length = 50, null = False, blank = False) def lagre (selv, * args, ** kwargs) ** kwargs) def __unicode __ (selv): returnere ": " format (selv.fornavn, selv.lastnavn) 

Registrer din Kunde modell i admin.py som dette:

fra django.contrib import admin fra .models import kunde # Registrer dine modeller her. admin.site.register (kunden) 

Opprett database og superbruker

Påfør migreringer og opprett en adminkonto.

python manage.py migrere python manage.py createsuperuser 

Kjør serveren din og naviger til http: // localhost: 8000 / admin /. Du bør nå kunne se din kundemodell der. Gå videre og legg til nye kunder i administrasjonen.

Indeksering av data

For å indeksere våre modeller begynner vi ved å lage en SearchIndex. SearchIndex Objekter bestemmer hvilke data som skal plasseres i søkeindeksen. Hver type modell må ha en unik searchIndex.

SearchIndex objekter er måten haystack bestemmer hvilke data som skal plasseres i søkeindeksen og håndterer datastrømmen. Å bygge en SearchIndex, vi skal arve fra indexes.SearchIndex og indexes.Indexable, definer feltene vi vil lagre våre data med, og definer a get_model metode.

La oss lage CustomerIndex å svare til vår Kunde modellering. Lag en fil search_indexes.py i kundens appkatalog, og legg til følgende kode.

fra .models import Kunde fra haystack importindekser klasse CustomerIndex (indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (document = True, use_template = True) first_name = indexes.CharField (model_attr = 'first_name') last_name = index .CharField (model_attr = 'last_name') other_names = indexes.CharField (model_attr = 'other_names') email = indexes.CharField (model_attr = 'email',) phone = indexes.CharField (model_attr = 'telefon',) balanse = indekser .IntegerField (model_attr = 'balanse', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') adresse = indexes.CharField (model_attr = 'adresse',) def get_model (selv): returnerer Kund def index_queryset (selv, bruk = Ingen): returner self.get_model (). objects.all () 

De EdgeNgramField er et felt i høstaket SearchIndex som forhindrer feilaktige kamper når deler av to forskjellige ord knuses sammen.

Det tillater oss å bruke Autofullfør funksjon for å utføre spørringer. Vi vil bruke autofullføring når vi begynner å spørre våre data.

Dokumentet = True Indikerer det primære feltet for søk innenfor. I tillegg er det  use_template = True i tekst feltet lar oss bruke en datasjema til å bygge dokumentet som vil bli indeksert.

La oss lage malen inne i vår kundes malkatalog. Innsiden   søk / indekser / kunder / customers_text.txt, legg til følgende:

object.first_name object.last_name object.other_names 

Reindex Data

Nå som dataene våre er i databasen, er det på tide å legge det inn i søkeindeksen. For å gjøre dette, bare kjør ./manage.py rebuild_index. Du får totaler av hvor mange modeller som ble behandlet og plassert i indeksen.

Indekserer 20 kunder 

Alternativt kan du bruke RealtimeSignalProcessor, som automatisk håndterer oppdateringer / sletter for deg. For å bruke det, legg til følgende i settings.py fil.

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 

Spørringsdata

Vi skal bruke en søkemal og Haystack API for å søke data.

Søke mal

Legg høststablene til URLconf.

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

La oss lage vår søkemal. I templates / search.html, legg til følgende kode.

% blokkhodet%    % endblock% % blokk navbar%  % endblock% % blokkinnhold% 
form.non_field_errors
form.as_p
% hvis spørring%

resultater

% for resultat på side.objekt_list%

Fornavn: result.first_name

Etternavn: result.last_name

Balanse: result.balance

E-post: result.email

Status: result.customer_status

% tom%

Ingen resultater.

% endfor%
% slutt om %
% endblock%

De page.object_list er en liste over Søkeresultat objekter som lar oss få de enkelte modellobjektene, for eksempel, result.first_name.

Din komplette prosjektstruktur bør se slik ut:

Kjør nå server, gå til 127.0.0.1:8000/search/, og gjør et søk som vist nedenfor.

Et søk av Albert vil gi resultater av alle kunder med navnet Albert. Hvis ingen kunde har navnet Albert, vil spørringen gi tomme resultater. Ta gjerne med deg med dine egne data.

Haystack API

Haystack har a SearchQuerySet klasse som er designet for å gjøre det enkelt og konsistent å utføre søk og gjenta resultater. Mye av SearchQuerySet API er kjent med Django's ORM QuerySet.

kunder / views.py, legg til følgende kode:

fra django.shortcuts import gjengi fra rest_framework.decorators import (api_view, renderer_classes,) fra .models import Kunde fra haystack.query import SearchQuerySet fra rest_framework.response import Svar # Lag dine synspunkter her. @api_view (['POST']) def search_customer (forespørsel): navn = request.data ['name'] customer = SearchQuerySet () .modeller (kunde) .autocomplete (first_name__startswith = navn) searched_data = [] for jeg i kunde : all_results = "first_name": i.first_name, "last_name": i.last_name, "balanse": i.balance, "status": i.customer_status, søkte_data.append (alle_resultater) returnere svar

Autofullfør er en snarvei-metode for å utføre et autofullføringssøk. Det må kjøres mot felt som enten er EdgeNgramField eller NgramField.

I det ovennevnte QuerySet, vi bruker inneholder Metode for å filtrere søket vårt for å hente bare resultatene som inneholder våre definerte tegn. For eksempel, Al vil bare hente detaljene til kundene som inneholder Al. Vær oppmerksom på at resultatene bare kommer fra felt som er definert i customer_text.txt fil.

Bortsett fra inneholder Feltoppslag, det finnes andre felt tilgjengelig for å utføre spørringer, inkludert:

  • innhold
  • inneholder
  • nøyaktig
  • gt
  • gte
  • lt
  • lte
  • i
  • begynner med
  • slutter med
  • område
  • fuzzy

Konklusjon

En stor mengde data blir produsert til enhver tid i sosiale medier, helse, shopping og andre sektorer. Mye av disse dataene er ustrukturert og spredt. Elasticsearch kan brukes til å behandle og analysere disse dataene i et skjema som kan forstås og konsumeres.

Elasticsearch har også blitt brukt mye for innholdssøking, dataanalyse og spørringer. For mer informasjon, besøk Haystack og Elasticsearch-nettstedene.