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 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..
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
configuratiesOm 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']
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)
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.
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
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'
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%% 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 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:
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.