Haystack queryset contains None elements
Asked Answered
D

3

8

I'm using Haystack for search, and the resulting SearchQuerySet returned contains None elements:

>> SearchQuerySet().models(Question, Document, Idea)
>> [<SearchResult: idea.idea (pk=3875)>, None, None, None]

Running rebuild_index doesn't help. If I remove the .models() call from the first line, the problem goes away. I could just filter out None elements from the results, but I wanted to know if this is intended behaviour?

I am using Django 1.4, Whoosh, and Haystack 2.0.0-beta

Danaedanaher answered 4/5, 2012 at 18:38 Comment(5)
I haven't tried it yet, but this guy suggests using Solr instead of Whoosh.Larissa
Update : now I've tried it and it works with Solr.Larissa
everybody knows that elastic search or solr do and perform better - but for small to mid-sized sites, Whoosh is very ok IMHO and makes no trouble installing/setting up (only afterwards, haha).Tc
@Danaedanaher are you using solr as well, now?Tc
@Danaedanaher having an answer two years later, you could accept it after two more years, no? ;-) at least it is the only answer that does somehow resolve the problem, and does not suggest installing a different backend ;-)Tc
T
5

I had this problem when haystack index had records without corresponding records in DB.

Turboelectric answered 5/5, 2012 at 12:2 Comment(3)
Thanks, this isn't the problem though. It turns out the 'None' values correspond to User objects. Apparently the models function removes hits that aren't of the right model type but leaves a None type instead of filtering them outDanaedanaher
Can't you say, is this problem only for 'whoosh' backend? Does using Solr engine solves it?Freddiefreddy
So there's no solution for Whoosh then?Ous
T
3

No, it is definitly not the intended behaviour, and as I can see, seems to be related to a design decision in Whoosh. And, as of December 2015, this still seems to be an issue, as can be seen here. Also, I can reproduce it with my setup (django 1.8.5, haystack 2.4.1, Whoosh 2.7.0) - that's why I came here.

Quick and dirty solution that worked for me: Define a new field on your index (type/model/tomato), set it the same for each model, and filter against that value:

.filter(type='my_modelname')

instead of

.models(MyModel).

I don't know (yet) how this scales, but seems to work ok.

Tc answered 14/12, 2015 at 17:22 Comment(0)
O
1

Had the same problem using Whoosh, installed Elasticsearch and the None elements went away.

Oates answered 20/6, 2015 at 2:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.