Haystack är ett Python-bibliotek som erbjuder modulär sökning efter Django. Den har ett API som ger stöd för olika sökbackändringar som Elasticsearch, Whoosh, Xapian och Solr.
Elasticsearch är en populär Lucene-sökmotor som kan söka efter fulltext, och den är utvecklad i Java.
Google-sökning använder samma sätt att indexera deras data, och det är därför det är väldigt lätt att hämta information med några få sökord, vilket visas nedan.
Det första steget är att få Elasticsearch igång lokalt på din maskin. Elasticsearch kräver Java, så du måste ha Java installerat på din maskin.
Vi följer instruktionerna från Elasticsearch-webbplatsen.
Ladda ner Elasticsearch 1.4.5 tjära enligt följande:
curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.4.5.tar.gz
Extrahera det enligt följande:
tjära -xvf elasticsearch-1.4.5.tar.gz
Det skapar sedan en grupp filer och mappar i din nuvarande katalog. Vi går sedan in i bin-katalogen enligt följande:
cd elasticsearch-1.4.5 / bin
Starta Elasticsearch enligt följande.
./ elasticsearch
För att bekräfta om den har installerats framgångsrikt, gå till http://127.0.0.1:9200/, och du borde se något så här.
"namn": "W3nGEDa", "klusternamn": "elasticsearch", "cluster_uuid": "ygpVDczbR4OI5sx5lzo0-w", "version": "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, för sökning"
Se till att du också har höstack installerad.
pip installera django-höstack
Låt oss skapa vårt Django-projekt. Vårt projekt kommer att kunna indexera alla kunder i en bank, vilket gör det enkelt att söka och hämta data med bara några söktermer.
django-admin startprojekt Bank
Detta kommando skapar filer som ger konfigurationer för Django-projekt.
Låt oss skapa en app för kunder.
cd bank python manage.py startapp kunder
settings.py
konfigurationerFör att kunna använda Elasticsearch för att indexera vårt sökbara innehåll måste vi definiera en back-end-inställning för höstack i vårt projekt settings.py
fil. Vi ska använda Elasticsearch som vår baksida.
HAYSTACK_CONNECTIONS
är en obligatorisk inställning och ska se så här ut:
HAYSTACK_CONNECTIONS = 'default': 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME': 'haystack',,
Inom settings.py
, Vi kommer också att lägga haystack och kunder till listan över installerade appar
.
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles' , 'rest_framework', 'haystack', 'customer']
Låt oss skapa en modell för kunder. I kunder / modeller.
py
, lägg till följande kod.
från __future__ importera unicode_literals från django.db importmodeller # Skapa dina modeller här. customer_type = ("Aktiv", "Aktiv"), ("Inaktiv", "Inaktiv")) klass Kund (models.Model): id = models.IntegerField (primary_key = True) first_name = models.CharField (max_length = 50 , null = Falskt, tomt = 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 = blank.txt = Falskt, tomt = True) balance = models.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, val = customer_type, default = "Aktiv") adress = models.CharField (max_length = 50, null = False, blank = False) def spara (själv, * args, ** kwargs) ** kwargs) def __unicode __ (själv): returnera ": ". format (self.first_name, self.last_name)
Registrera din Kund
modell i admin.py
så här:
från django.contrib import admin från .models import Kund # Registrera dina modeller här. admin.site.register (kund)
Använd dina migreringar och skapa ett administratorkonto.
python manage.py migrera python manage.py skaparuperuser
Kör din server och navigera till http: // localhost: 8000 / admin /. Du borde nu kunna se din kundmodell där. Fortsätt och lägg till nya kunder i admin.
För att indexera våra modeller börjar vi med att skapa en SearchIndex
. SearchIndex
Objekt bestämmer vilka data som ska placeras i sökindexet. Varje typ av modell måste ha en unik searchIndex
.
SearchIndex
objekt är hur höstacken bestämmer vilken data som ska placeras i sökindex och hanterar flödet av data. Att bygga en SearchIndex
, Vi kommer att ärva från indexes.SearchIndex
och indexes.Indexable
, definiera de fält vi vill lagra våra data med och definiera a get_model
metod.
Låt oss skapa CustomerIndex
att motsvara vår Kund
modellering. Skapa en fil search_indexes.py
i kundens appkatalog och lägg till följande kod.
från .models importera kund från haystack importindex klass CustomerIndex (index.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (dokument = True, use_template = True) first_name = indexes.CharField (model_attr = 'first_name') last_name = index .CharField (model_attr = 'sista_namn') other_names = indexes.CharField (model_attr = 'other_names') email = indexes.CharField (model_attr = 'email',) phone = indexes.CharField (model_attr = 'phone',) balans = index .IntegerField (model_attr = 'balans', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') adress = indexes.CharField (model_attr = 'adress',) def get_model (själv): returnera Kund def index_queryset (själv, använder = Ingen): returnera self.get_model (). objects.all ()
De EdgeNgramField
är ett fält i höstacken SearchIndex
som förhindrar felaktiga matchningar när delar av två olika ord mashes ihop.
Det tillåter oss att använda autoslutförande
funktion för att utföra frågor. Vi kommer att använda autofullständig när vi börjar fråga våra uppgifter.
dokument = True
Indikerar det primära fältet för sökning inom. Dessutom use_template = Sant
i text
fältet tillåter oss att använda en datamall för att bygga dokumentet som ska indexeras.
Låt oss skapa mallen i vår kundmallkatalog. Inuti sök / index / kunder / customers_text.txt
, lägg till följande:
object.first_name object.last_name object.other_names
Nu när våra data finns i databasen är det dags att lägga det i vårt sökindex. För att göra det, kör helt enkelt ./manage.py rebuild_index
. Du får totalt antal hur många modeller som bearbetats och placerades i indexet.
Indexering av 20 kunder
Alternativt kan du använda RealtimeSignalProcessor
, som automatiskt hanterar uppdateringar / raderar för dig. För att använda det, lägg till följande i settings.py
fil.
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
Vi ska använda en sökmall och Haystack API för att fråga data.
Sökmall
Lägg till höstackadresserna till din URLconf.
url (r '^ search /', inkludera ('haystack.urls')),
Låt oss skapa vår sökmall. I templates / search.html
, lägg till följande kod.
% blockhuvud% % endblock% % block navbar% % endblock% % block content%% endblock%
De page.object_list
är en lista över Sökresultat
objekt som låter oss få de enskilda modellobjekten, till exempel, result.first_name
.
Din fullständiga projektstruktur ska se ut så här:
Nu kör server, gå till 127.0.0.1:8000/search/
, och gör en sökning som visas nedan.
En sökning av Albert
kommer att ge resultat av alla kunder med namnet Albert
. Om ingen kund har namnet Albert, kommer frågan att ge tomma resultat. Känn dig fri att leka med dina egna data.
Haystack har a SearchQuerySet
klass som är utformad för att göra det enkelt och konsekvent att utföra sökningar och iterera resultat. Mycket av SearchQuerySet
API är bekant med Djosos ORM QuerySet
.
I kunder / views.py
, lägg till följande kod:
från django.shortcuts import gör från rest_framework.decorators import (api_view, renderer_classes,) från .models importera kund från haystack.query import SearchQuerySet från rest_framework.response import Svar # Skapa dina åsikter här. @api_view (['POST']) def search_customer (förfrågan): name = request.data ['name'] customer = SearchQuerySet () .modeller (kund) .autocomplete (first_name__startswith = namn) searched_data = [] för jag i kund : all_results = "first_name": i.first_name, "last_name": i.last_name, "balans": i.balance, "status": i.customer_status, search_data.append (all_results) returnera svar
autoslutförande
är en genvägsmetod för att utföra en autofullständig sökning. Det måste köras mot fält som antingen är EdgeNgramField
eller NgramField
.
I ovanstående Queryset
, vi använder innehåller
Metod för att filtrera vår sökning för att bara hämta resultaten som innehåller våra definierade tecken. Till exempel, al
kommer bara hämta detaljerna för de kunder som innehåller al
. Observera att resultaten endast kommer från fält som har definierats i customer_text.txt-filen
.
Förutom innehåller
Fältökning, det finns andra fält tillgängliga för att utföra frågor, bland annat:
En stor mängd data produceras vid något tillfälle i sociala medier, hälsa, shopping och andra sektorer. Mycket av dessa data är ostrukturerad och spridd. Elasticsearch kan användas för att bearbeta och analysera dessa data i en form som kan förstås och konsumeras.
Elasticsearch har också använts i stor utsträckning för innehållssökning, dataanalys och frågor. För mer information, besök Haystack och Elasticsearch webbplatser.