Индексирование сена Джанго Более одной модели - PullRequest
3 голосов
/ 03 апреля 2011

Я пытаюсь реализовать поиск Haystack для моего сайта с помощью Whoosh back-end. Мне удалось успешно настроить приложение haystack, и я могу найти модель, которую я зарегистрировал, но когда я создаю файл search_indexes.py для другого приложения, у меня возникает следующая проблема:

У меня есть две модели: участник и события. Я создаю search_indexes.py для них обоих и соответствующие файлы / search / ... _text.txt в папке шаблонов. Тогда я использую ./manage.py rebuild_index

Я получаю следующее сообщение:

Indexing 8 events  
Indexing 5 members

Однако я не вижу 13 проиндексированных предметов:

 $> ./manage.py shell    
 $> from haystack.query import SearchQuerySet   
 $> sqs = SearchQuerySet().all()  
 $> print sqs.count()  
 $> 8

И это 8 событий, которые были проиндексированы. Следовательно, с веб-сайта я могу искать только события, а не участников. Удаление файла search_indexes.py из папки приложения «Событие» и повторное выполнение всего корректно индексируют 5 членов, и их можно искать как обычно. Что может быть причиной этого?

Обновление: Я включил файлы search_indexes.py в другие приложения, чтобы посмотреть, правильно ли они проиндексированы. При перестроении индекса я получаю следующее сообщение:

Indexing 8 events.  
Indexing 4 guests.     
Indexing 5 members.    
Indexing 8 sponsors.    

Теперь он индексирует все события и участников, но ни одного из гостей и спонсора. Я могу искать события и участников, но не для двух других (используя API SearchQuery и веб-сайт)

Обновление: Возможно, проблема решена путем изменения источника haystack.backends.whoosh_backend. Пожалуйста, смотрите ответы

Ответы [ 2 ]

2 голосов
/ 05 апреля 2011

Последние пару дней у меня была такая же проблема (хороший выбор времени). Я решил начать с того места, где вы остановились, и посмотреть, не смогу ли я лучше выделить причину.

Суженные результаты (по крайней мере частично) генерируются запросом моделей, которые зарегистрированы на сайте (L298 и далее). Для моего кода запрос, который он генерирует ...

django_ct:(barnaby.tag OR barnaby.userprofile)

... что дает результат только с моделями barnaby.tag. Однако, если я бегу ...

django_ct:(barnaby.tag OR barnaby.userprofile) (username:pfrazee OR name:Tag114)

... Я получаю результаты как по тегу, так и по профилю пользователя. Я могу только предположить, что это проблема с Whoosh, но я не могу сказать наверняка. Мы, вероятно, должны связаться с Хейстек и / или рассекать об этом.

В любом случае, вы можете избежать этой проблемы, не изменяя стог сена, установив:

HAYSTACK_LIMIT_TO_REGISTERED_MODELS = False
1 голос
/ 05 апреля 2011

Ладно, вот что я сделал, чтобы выяснить, в чем проблема - свист или стог сена. Я открыл оболочку django и выполнил поиск по термину, который не отображался в поиске haystack API SearchQuery:

./manage.py shell   
$>> import whoosh 
$>> from whoosh.query import *  
$>> from whoosh.index import open_dir  
$>> ix.schema  
<Schema: ['branch', 'category', 'coordinator', 'date_event', 'designation','details', 'django_ct', 'django_id'> 'name', 'organisation', 'overview','text', 'title']>
$>> ix = open_dir('/home/somedir/my_project/haystack/whoosh/')  
$>> searcher = ix.searcher()  
$>> res = ix.search(Term('text',u'pink'))  
$>> print res  
<Top 1 Results for Term('text', 'pink') runtime=0.000741004943848>
$>> print res['0']['name']  
u'Pink Floyd'   

Итак, вы видите, Whoosh правильно индексирует все данные. Итак, теперь я пробую SearchQuery API

./manage.py shell
 $>> from haystack.query import SearchQuerySet
 $>> sqs = SearchQuerySet().filter(content='pink')
 $>> sqs
 $>> []

Итак, я понимаю, что должен проверить файл whoosh_backend.py библиотеки стога сена, чтобы увидеть, что происходит. Открыто - haystack.backends.whoosh_backend around line number 345

'''Comment these two lines because the raw_results set becomes empty after the filter     call for some queries'''
if narrowed_results:
      raw_results.filter(narrowed_results)

до

#if narrowed_results:
      #raw_results.filter(narrowed_results)

И тогда это работает. SearchQueryAPI возвращает точно один результат для тестового запроса, как и ожидалось. Веб-поиск работает. Время сладкого сна, хотя я хотел бы знать, в чем проблема с стогом сена здесь.

...