2016-11-02 5 views
2

Edit: Plus d'infos sur fond de poste ...Django Haystack et Whoosh Recherche de travail, mais SearchQuerySet Retour 0 Résultats

Original Question:

Je semblent avoir le même problème que dans ce (sans solution) question: django-haystack + Whoosh SearchQuerySet().all() always None

J'ai mis en place Haystack avec Whoosh sur mon projet Django et tout fonctionnait bien au début (SearchQuerySet utilisé pour retourner des résultats), mais après une tentative avortée de créer une nouvelle forme de recherche personnalisée (reculé de git) il apparaît cette indexation et la page de recherche d'origine fonctionnent tout de même bien, mais maintenant SearchQuerySet() renvoie toujours 0 résultats!

Course à pied:

manage.py rebuild_index --verbosity=2 

montre correctement:

Indexing 14 assets 
    indexed 1 - 14 of 14 (worker PID: 1234). 

Ces actifs indexés peuvent alors tous être correctement recherché sur le moteur de recherche d'origine.

Cependant, l'ouverture d'un shell Django et le fonctionnement:

from haystack.query import SearchQuerySet 
SearchQuerySet().all().count() 

retourne toujours 0!

pip freeze significatives:

  • python 3.5.2
  • Django 1.9.3
  • django-meule de foin 2.5.0
  • Whoosh 2.7.4

/myapp/search_indexes .py:

from haystack import indexes 
from .models import Asset 

class AssetIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.NgramField(document=True, use_template=True) 
    asset_description = indexes.CharField(model_attr='asset_description') 
    manufacturer = indexes.CharField(model_attr='asset_manufacturer') 

    def get_model(self): 
     return Asset 

    def no_query_found(self): 
     return self.searchqueryset.exclude(content='foo') 

    def index_queryset(self, using=None): 
     return self.get_model().objects.all() 

/myapp/templates/search/indexes/myapp/asset_text.txt:

{{ object.asset_description }} 
{{ object.asset_details }} 
{{ object.asset_manufacturer }} 
{{ object.asset_model }} 
... etc. 

/myapp/urls.py:

urlpatterns = [ 
    .... 
    url(r'^search/', include('haystack.urls')), 
    .... 
] 

EDIT:

creuser Ainsi, dans le code source de Haystack, j'ai découvert d'où vient le 0, mais pas pourquoi!

/myvenv/Lib/site-packages/hackstack/query.py

class SearchQuerySet(object): 
    ... 

    def __len__(self): 
     if self._result_count is None: 
      self._result_count = self.query.get_count() 

     # Some backends give weird, false-y values here. Convert to zero. 
     if not self._result_count: 
      self._result_count = 0 

    # This needs to return the actual number of hits, not what's in the cache. 
    return self._result_count - self._ignored_result_count 

    .... 

Modification du 0 à tout entier rend SearchQuerySet retourne toujours int, mais je ne sais toujours pas pourquoi if not self._result_count serait vrai ...

Répondre

0

Il ressemble à un bug de botte de foin qui a déjà été signalé, mais n'a pas encore abordé:

https://github.com/django-haystack/django-haystack/issues/1021

Malheureusement, si le « texte » champ d'index est Ngram ou SearchQuerySet().count() EdgeNgram et SearchQuerySet().all().count() retournera 0 sauf si vous spécifiez un filtre, par exemple SearchQuerySet().all().exclude(content='thisshouldnotmatchanythingintheindex').count() renvoie le nombre total d'objets indexés.