J'essaie de travailler avec django-haystack (2.6.0) et solr (4.10.4) pour implémenter deux champs de recherche. Je voudrais rechercher mon modèle par ship
nom ou expédier country
(renvoie une liste de navires d'un pays donné) mais ici j'ai un problème si je définis un champ avec document=True
je n'obtiens aucun résultat. J'ai jaché le documentation et ce answer et il semble assez facile.Le champ de texte Django-Haystack renvoie des lignes vides " n n"
J'ai créé le search_indexes.py
suivant:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return ShipList
def index_queryset(self, using=None):
return self.get_model().objects.all()
et moi avons créé un nouveau modèle dans mon application qui spécifie tous les champs à utiliser dans une recherche:
search/indexes/myapp/shiplist_text.txt
{{ objects.ship }}
{{ objects.country }}
alors voici c'est mon modèle:
class ShipList(models.Model):
ship = models.CharField(max_length=200)
country = models.CharField(max_length=200)
region = models.CharField(max_length=250, blank=True)
city = models.CharField(max_length=250, blank=True)
ship_class = models.CharField(max_length=200, blank=True)
ship_type = models.CharField(max_length=200, blank=True)
remarks = models.CharField(max_length=200, blank=True)
url = models.URLField(max_length=200)
slug = models.SlugField()
et la vue:
def ship_search(request):
results = None
cd = None
form = SearchForm()
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
cd = form.cleaned_data
results = SearchQuerySet().models(ShipList).filter(content=cd['query']).load_all()
return render(request,
'core/draft/search.html',
{'form': form,
'results': results,
'cd': cd})
modèle simple
{% block search %}
{% if "query" in request.GET %}
{% for result in results %}
{% with ship=result.object %}
<p>{{ ship.ship }}</p>
<p><a href="{{ ship.get_absolute_url }}">{{ ship.ship }}</a></p>
{% endwith %}
{% empty %}
<p>There are no results for your query.</p>
{% endfor %}
{% else %}
<h1>Search for posts</h1>
<form action="." method="get">
{{ form.as_p }}
<input type="submit" value="Search">
</form>
{% endif %}
{% endblock %}
donc j'ai vérifié interface solr http://127.0.0.1:8983/solr/#/myapp/query
pour une réponse JSON:
{
"responseHeader": {
"status": 0,
"QTime": 2
},
"response": {
"numFound": 11,
"start": 0,
"docs": [
{
"django_ct": "core.shiplist",
"id": "core.shiplist.1",
"django_id": "1",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.2",
"django_id": "2",
"text": "\n\n"
},
{
"django_ct": "core.shiplist",
"id": "core.shiplist.3",
"django_id": "3",
"text": "\n\n"
]
}
}
donc ce sont les données stockées pour chaque navire dans l'index de recherche et J'ai découvert que le champ de texte contient "\n\n
Je devine voici le problème peut-être qu'il devrait ressembler à ceci:
"text": "USS Arizona\nUnited States"
jusqu'à présent, je l'ai essayé de créer search_indexs.py sans use_template
:
class ShipListIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, model_attr='ship')
def get_model(self):
return ShipList
et il fonctionne très bien, je peux effectuer une recherche par nom de navire et la sortie de la requête est correcte.
{
"id": "core.shiplist.5",
"django_ct": "core.shiplist",
"django_id": "5",
"text": "USS Arizona"
},
et enfin mon solrconfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<config>
<luceneMatchVersion>LUCENE_36</luceneMatchVersion>
<requestHandler name="/select" class="solr.StandardRequestHandler"
default="true" />
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
<requestHandler name="/admin" class="solr.admin.AdminHandlers" />
<requestHandler name="/admin/ping" class="solr.PingRequestHandler">
<lst name="invariants">
<str name="qt">search</str>
<str name="q">*:*</str>
</lst>
</requestHandler>
</config>
Il est évident que je manque quelque chose ou je ne comprends pas comment ça marche?
Êtes-vous sûr de vouloir {{object * s * .property} 'et non {object.property}'?La réponse que vous avez liée utilise la forme singulière .. – MatsLindh
Cheers mate! maintenant ça fonctionne bien. – casol