Så här indexerar och frågar data med hästen och Elasticsearch i Python

Höstack

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

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.

Installera Django Haystack och Elasticsearch

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 konfigurationer

Fö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']

Skapa modeller

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) 

Skapa databas och superanvändare

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.

Indexering Data

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 

Reindex Data

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' 

Frågande data

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% 
form.non_field_errors
form.as_p
% om fråga%

Resultat

% för resultat i page.object_list%

Förnamn: result.first_name

Efternamn: result.last_name

Balans: result.balance

E-post: result.email

Status: result.customer_status

% tom%

Inga resultat funna.

% endfor%
% endif%
% 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 API

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.

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:

  • innehåll
  • innehåller
  • exakt
  • gt
  • gte
  • lt
  • lte
  • i
  • börjar med
  • slutar med
  • räckvidd
  • suddig

Slutsats

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.