Utilizzo di Django e Haystack con ElasticSearch.
Dopo aver installato pagliaio e ES, e ricostruire indice
./manage.py rebuild_index
ATTENZIONE: Questo rimuoverà irreparabilmente TUTTO dal tuo indice di ricerca in connessione "default". Le tue scelte dopo questo sono per ripristinare dai backup o ricostruire tramite il rebuild_index
comando. Sei sicuro di voler continuare? [y / N] y
Removing all documents from your index because you said so.
All documents removed.
Indexing 1039 <django.utils.functional.__proxy__ object at 0x10ca3ded0>.
AttributeError: "module" object has no attribute "ElasticSearchError"
L'aggiornamento dell'indice ha lo stesso problema
/manage.py update_index
Indexing 1039 <django.utils.functional.__proxy__ object at 0x10ea49d90>.
AttributeError: "module" object has no attribute "ElasticSearchError"
L'indice chiaro funziona bene (probabilmente perché non c'è un indice)
./manage.py clear_index
WARNING: This will irreparably remove EVERYTHING from your search index in connection "default".
Your choices after this are to restore from backups or rebuild via the `rebuild_index` command.
Are you sure you wish to continue? [y/N] y
Rimozione di tutti i documenti dal tuo indice perché hai detto così. Tutti i documenti rimossi
versioni
django-pagliaio == 2.0.0-beta
== pyelasticsearch 0.5
elasticsearch == 0.20.6
localhost: 9200 dice:
{
"ok" : true,
"status" : 200,
"name" : "Jigsaw",
"version" : {
"number" : "0.20.6",
"snapshot_build" : false
},
"tagline" : "You Know, for Search"
}
Impostazioni del pagliaio:
HAYSTACK_CONNECTIONS = {
"default": {
"ENGINE": "haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine",
"URL": "http://127.0.0.1:9200/",
"INDEX_NAME": "haystack",
},
}
search_indexes.py:
import datetime
import haystack
from haystack import indexes
from app.models import City
class CityIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr="name")
state = indexes.CharField(model_attr="state")
country = indexes.CharField(model_attr="country")
lat = indexes.FloatField(model_attr="latitude")
lon = indexes.FloatField(model_attr="longitude")
alt = indexes.FloatField(model_attr="altitude")
pop = indexes.IntegerField(model_attr="population")
def get_model(self):
return City
Qualsiasi aiuto: perché sto ricevendo un errore?
risposte:
2 per risposta № 1Risolto!
Dopo il debug del processo usando pdb
./manage.py rebuild_index
Alla riga 222 - in /haystack/backend/elasticsearch_backend.py
Cambiato
except (requests.RequestException, pyelasticsearch.ElasticSearchError), e:
A
# except (requests.RequestException, pyelasticsearch.ElasticSearchError), e:
except Exception as inst:
import pdb; pdb.set_trace()
Ho scoperto che l'errore principale era questo
"ElasticSearch" object has no attribute "from_python".
A cui ho trovato la soluzione qui - https://github.com/toastdriven/django-haystack/issues/514#issuecomment-4058230
La versione di pyelasticsearch che stavo usando proveniva da http://github.com/rhec/pyelasticsearch,
Così ho installato pyelasticsearch da una forchetta - http://github.com/toastdriven/pyelasticsearch usando:
pip install --upgrade git+https://github.com/toastdriven/pyelasticsearch.git@3bfe1a90eab6c2dfb0989047212f4bc9fb814803#egg=pyelasticsearch
e che l'ha riparato e l'indice è stato costruito!