2017-08-30 6 views
0

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?

+1

Ê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

+0

Cheers mate! maintenant ça fonctionne bien. – casol

Répondre

0

Dans votre modèle pour la façon dont le champ de recherche doit être formé:

search/indexes/myapp/shiplist_text.txt 

{{ objects.ship }} 
{{ objects.country }} 

.. vous faites référence objects (avec un s à la fin). Le nom correct est object, sans supplément s:

{{ object.ship }} 
{{ object.country }} 

Le \ n supplémentaire que vous voyez est la nouvelle ligne à la fin du fichier. Enregistrez-le sans cela et vous éviterez d'avoir un \ n supplémentaire à la fin de votre valeur. Cependant, cela n'a pas vraiment d'importance pour la recherche.