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 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.
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
konfigurasjonerFor å 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']
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)
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.
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
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'
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%% 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 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
.
I 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:
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.