Gegevens indexeren en opvragen met Haystack en Elasticsearch in Python

Hooiberg

Haystack is een Python-bibliotheek die modulair op Django kan zoeken. Het beschikt over een API die ondersteuning biedt voor verschillende zoekacties zoals Elasticsearch, Whoosh, Xapian en Solr.

Elasticsearch

Elasticsearch is een populaire Lucene-zoekmachine die in staat is om op volledige tekst te zoeken en is ontwikkeld in Java.

Google-zoekopdrachten gebruiken dezelfde benadering voor het indexeren van hun gegevens. Daarom is het erg eenvoudig om informatie te achterhalen met slechts een paar zoekwoorden, zoals hieronder wordt weergegeven..

Installeer Django Haystack en Elasticsearch

De eerste stap is om Elasticsearch lokaal op uw computer te laten werken. Elasticsearch vereist Java, dus u moet Java op uw computer hebben geïnstalleerd.

We gaan de instructies van de Elasticsearch-site volgen.

Download de Elasticsearch 1.4.5 tar als volgt:

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

Extraheer het als volgt:

tar -xvf elasticsearch-1.4.5.tar.gz

Vervolgens maakt het een reeks bestanden en mappen in uw huidige map. We gaan dan als volgt naar de bin-map:

cd elasticsearch-1.4.5 / bin

Start Elasticsearch als volgt.

./ elasticsearch

Om te controleren of het met succes is geïnstalleerd, gaat u naar http://127.0.0.1.19200/ en ziet u zoiets als dit.

"name": "W3nGEDa", "cluster_name": "elasticsearch search", "cluster_uuid": "ygpVDczbR4OI5sx5lzo0-w", "version": "number": "5.6.3", "build_hash": "1a2f265", "build_date": "2017-10-06T20: 33: 39.012Z", "build_snapshot": false, "lucene_version": "6.6.1", "tagline": "You Know, for Search" 

Zorg dat je hooiberg ook geïnstalleerd hebt.

pip installeer django-hooiberg

Laten we ons Django-project maken. Ons project zal in staat zijn om alle klanten in een bank te indexeren, waardoor het gemakkelijk is om met slechts enkele zoektermen te zoeken en gegevens op te halen.

django-admin startproject Bank

Met deze opdracht worden bestanden gemaakt die configuraties bieden voor Django-projecten.

Laten we een app maken voor klanten.

cd Bank python manage.py startapp-klanten

settings.py configuraties

Om Elasticsearch te gebruiken om onze doorzoekbare inhoud te indexeren, moeten we een back-end-instelling voor hooiberg definiëren in de projecttaken van ons project. settings.py het dossier. We gaan Elasticsearch gebruiken als onze back-end.

HAYSTACK_CONNECTIONS is een vereiste instelling en ziet er als volgt uit:

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

Binnen de settings.py, we gaan ook hooiberg en klanten toevoegen aan de lijst met geïnstalleerde apps.

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

Maak modellen

Laten we een model voor klanten maken. In klanten / modellen.py, voeg de volgende code toe.

van __future__ import unicode_literals van django.db importmodellen # Maak hier uw modellen. customer_type = (("Actief", "Actief"), ("Inactief", "Inactief")) klasse Klant (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 = Waar, leeg = Waar) phone = models.CharField (max_length = 30, null = False, blank = True) balance = models.IntegerField (default = "0") customer_status = models.CharField (max_length = 100, keuzes = klant_type, default = "Active") address = models.CharField (max_length = 50, null = False, blank = False) def save (self, * args, ** kwargs): return super (Customer, self) .save (* args, ** kwargs) def __unicode __ (self): return ": ". format (self.first_name, self.last_name) 

Registreer uw Klant model in admin.py zoals dit:

van django.contrib importeer admin van .models importeer Klant # Registreer uw modellen hier. admin.site.register (Customer) 

Maak database en super gebruiker

Pas uw migraties toe en maak een beheerdersaccount aan.

python manage.py migrate python manage.py createsuperuser 

Voer uw server uit en ga naar http: // localhost: 8000 / admin /. U zou nu uw klantmodel daar moeten kunnen zien. Ga je gang en voeg nieuwe klanten toe in de admin.

Gegevens indexeren

Om onze modellen te indexeren, beginnen we met het maken van een SearchIndex. SearchIndex objecten bepalen welke gegevens in de zoekindex moeten worden geplaatst. Elk type model moet een uniek exemplaar hebben searchIndex.

SearchIndex Objecten zijn de manier waarop hooiberg bepaalt welke gegevens in de zoekindex moeten worden geplaatst en hoe de gegevensstroom wordt verwerkt SearchIndex, we gaan erven van de indexes.SearchIndex en indexes.Indexable, definieer de velden waarmee we onze gegevens willen opslaan en definieer a get_model methode.

Laten we het maken CustomerIndex om te corresponderen met onze Klant modellering. Maak een bestand search_indexes.py in de app-map van de klant en voeg de volgende code toe.

from .models import Klant uit hooiberg import indexen klasse CustomerIndex (indexes.SearchIndex, indexes.Indexable): text = indexes.EdgeNgramField (document = True, use_template = True) first_name = indexes.CharField (model_attr = 'first_name') last_name = indexen .CharField (model_attr = 'last_name') other_names = indexes.CharField (model_attr = 'other_names') email = indexes.CharField (model_attr = 'email',) phone = indexes.CharField (model_attr = 'phone',) balans = indexen .IntegerField (model_attr = 'balance', default = "0") customer_status = indexes.CharField (model_attr = 'customer_status') address = indexes.CharField (model_attr = 'address',) def get_model (self): return Klant def index_queryset (self, using = None): return self.get_model (). objects.all () 

De EdgeNgramField is een veld in de hooiberg SearchIndex die onjuiste overeenkomsten voorkomt wanneer delen van twee verschillende woorden samen worden geplet.

Hiermee kunnen we de autocomplete functie om vragen uit te voeren. We zullen autocomplete gebruiken wanneer we beginnen met het opvragen van onze gegevens.

document = True geeft het primaire veld aan om binnen te zoeken. Bovendien, de  use_template = True in de tekst veld stelt ons in staat een datasjabloon te gebruiken om het document te bouwen dat zal worden geïndexeerd.

Laten we de sjabloon maken in de sjabloongids van onze klanten. Binnen   search / indexen / klanten / customers_text.txt, voeg het volgende toe:

object.first_name object.last_naam object.other_names 

Gegevens opnieuw indexeren

Nu onze gegevens in de database staan, is het tijd om het in onze zoekindex te plaatsen. Om dit te doen, gewoon uitvoeren ./manage.py rebuild_index. U krijgt een totaaloverzicht van het aantal modellen dat in de index is verwerkt en geplaatst.

Indexeren van 20 klanten 

Als alternatief kunt u gebruiken RealtimeSignalProcessor, die automatisch updates / verwijderingen voor u afhandelt. Om het te gebruiken, voeg het volgende toe in de settings.py het dossier.

HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' 

Gegevens opvragen

We gaan een zoeksjabloon en de Haystack API gebruiken om gegevens op te vragen.

Zoek sjabloon

Voeg de hooiberijt-urls toe aan uw URLconf.

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

Laten we onze zoeksjabloon maken. In templates / search.html, voeg de volgende code toe.

% block head%    % endblock% % block navbar%  % endblock% % block content% 
form.non_field_errors
form.as_p
% if query%

resultaten

% voor resultaat in page.object_list%

Voornaam: result.first_name

Achternaam: result.last_naam

Saldo: result.balance

E-mail: result.email

Status: result.customer_status

% empty%

geen resultaten gevonden.

% endfor%
% stop als %
% endblock%

De page.object_list is een lijst van Zoekresultaat objecten die ons in staat stellen om de individuele modelobjecten te krijgen, bijvoorbeeld, result.first_name.

Uw complete projectstructuur zou er ongeveer zo uit moeten zien:

Voer nu de server uit, ga naar 127.0.0.1:8000/search/, en doe een zoekopdracht zoals hieronder getoond.

Een zoekopdracht van Albert geeft resultaten van alle klanten met de naam Albert. Als geen klant de naam Albert heeft, geeft de query lege resultaten. Voel je vrij om rond te spelen met je eigen gegevens.

Haystack API

Haystack heeft een SearchQuerySet klasse die is ontworpen om het gemakkelijk en consistent te maken om zoekopdrachten uit te voeren en resultaten te herhalen. Veel van de SearchQuerySet API is bekend met de ORM van Django QuerySet.

In klanten / views.py, voeg de volgende code toe:

van django.shortcuts importeren renderen van rest_framework.decorators importeren (api_view, renderer_classes,) van .models importeren Klant van haystack.query importen SearchQuerySet van rest_framework.response import Antwoord # Maak hier uw opvattingen. @api_view (['POST']) def search_customer (request): naam = request.data ['name'] klant = SearchQuerySet (). models (Customer) .autocomplete (first_name__startswith = name) searched_data = [] voor i in klant : all_results = "first_name": i.first_name, "last_name": i.last_name, "balance": i.balance, "status": i.customer_status, searched_data.append (all_results) return Response (searched_data)

autocomplete is een sneltoetsmethode om een ​​automatisch aanvullen uit te voeren. Het moet ook tegen velden worden uitgevoerd EdgeNgramField of NgramField.

In bovenstaande queryset, we gebruiken de bevat methode om onze zoekopdracht te filteren om alleen de resultaten op te halen die onze gedefinieerde karakters bevatten. Bijvoorbeeld, al haalt alleen de gegevens op van de klanten die deze bevatten al. Merk op dat de resultaten alleen afkomstig zijn van velden die zijn gedefinieerd in de bestand client_text.txt.

Los van de bevat Field Lookup, er zijn andere velden beschikbaar voor het uitvoeren van query's, waaronder:

  • inhoud
  • bevat
  • exact
  • gt
  • gte
  • lt
  • lte
  • in
  • begint met
  • eindigt met
  • reeks
  • fuzzy

Conclusie

Er wordt op elk moment een enorme hoeveelheid gegevens geproduceerd in sociale media, gezondheidszorg, winkelen en andere sectoren. Veel van deze gegevens zijn ongestructureerd en verspreid. Elasticsearch kan worden gebruikt om deze gegevens te verwerken en te analyseren in een vorm die kan worden begrepen en geconsumeerd.

Elasticsearch is ook uitgebreid gebruikt voor zoeken naar inhoud, gegevensanalyse en zoekopdrachten. Ga voor meer informatie naar de Haystack- en Elasticsearch-sites.