Поиск сходства в Django Haystack

Я новичок в Django, делаю примитивный сайт. Я установил haystack и Whoosh в качестве поисковой системы, потому что это было проще всего. Он работает нормально, но есть проблема, и я не знаю, как ее погуглить. На моем сайте есть несколько категорий, и я проиндексировал их имена для поиска. Итак, когда пользователь входит в раздел «Вычислительная техника», он находит категорию вычислений и ссылается на нее. Но есть проблема. Если пользователь вводит «Comp» в поле поиска, он вообще не находит «Computing». Это что-то, что можно настроить и как?

РЕДАКТИРОВАТЬ:

Что еще пробовал? Установка haystack 2.0 в соответствии с этим учебник, установка solr вместо whoosh, пробование полей Ngram, перестройка индексов 10 раз, переписывание search_indexes.py. Все. Не работает. Если я наберу Comp, он не найдет Computing. Что еще я могу сделать? Я заметил, что в приведенном выше руководстве все сразу работает как шарм.


person darxsys    schedule 15.01.2013    source источник


Ответы (3)


Когда вы занимаетесь обычным делом:

SearchQuerySet().filter(title='Computing')

в Haystack 1.x он фильтрует все, в точности совпадающее с параметром "Вычисления".

Вы можете изменить это поведение с помощью поиска полей, например, использование 'contains' отфильтрует все, что содержит данную строку (Computing, Utingcomp, Comp):

SearchQuerySet().filter(title__contains='Comp')

В Haystack 2.x фильтром по умолчанию является "содержит", поэтому он должен вести себя так, как вы ожидаете от него "из коробки".

person Tom    schedule 15.01.2013
comment
Я действительно не знаю, как это настроить. Я просто прошел обучение, чтобы заставить его работать, и понятия не имею, как это сделать. - person darxsys; 15.01.2013
comment
Самая простая вещь, которая должна работать, - это обновление до Haystack 2.x (pip install -e git + github.com/toastdriven/) - он все еще находится в стадии бета-тестирования, но я нашел его достаточно стабильным для использования. Следующая лучшая вещь, но она не рассматривается в руководстве (хотя вы в конечном итоге будете заниматься такими вещами, когда привыкаете к разработке Django), - это создать свою собственную форму поиска (django-haystack.readthedocs.org/en/latest/) с выше изменение. - person Tom; 15.01.2013
comment
Нет, это не работает. Установил haystack 2, установил свист, не работает. Установил solr, не работает. Ах хорошо. - person darxsys; 16.01.2013
comment
Я пробовал использовать поиск по полю __contains. Всегда возвращает 0 результатов. Я могу выполнить SearchQuerySet.all () и получить результаты, но не с фильтром. Это убивает меня! Какие-либо предложения? - person AndrewSmiley; 11.12.2013

Ознакомьтесь с документацией по автозаполнению. Вам необходимо настроить индексы для поддержки Ngram, но это должно быть именно то, что вам нужно.

from haystack.query import SearchQuerySet

SearchQuerySet().autocomplete(content_auto='old')
# Result match things like 'goldfish', 'cuckold' & 'older'.
person Shawn H    schedule 15.01.2013
comment
Я не этого хотел. - person darxsys; 16.01.2013
comment
Но плюс 1 за использование рогоносца :) - person Henrik Andersson; 16.01.2013

Итак, если я понимаю, то, что вы ищете, является эквивалентом LIKE в SQL. Проблема в том, что поисковые системы, поддерживающие Haystack, не похожи на СУБД.

Низкоуровневая реализация этого фильтра будет включать использование подстановочных знаков, но большинство бэкэндов Haystack не поддерживают начальный подстановочный знак, что требуется для фильтра _1 _ / _ 2_. Однако, поскольку большинство серверных ВМ поддерживают завершающие подстановочные знаки, Haystack 2.x включает фильтр startswith. Единственный случай, когда это не обрабатывается, - это поиск конца слова, что кажется невозможным.

Итак, если вы проиндексировали:

"Look at our great discounts in Computer section"

Тогда следующий запрос Haystack ДОЛЖЕН совпадать:

SearchQuerySet().filter(title__startswith='comp')
# match!

Обратите внимание на разницу между фильтрами Django и Haystack startswith. Django startswith будет соответствовать началу полного предложения (т. Е. CharField), но вариант Haystack будет соответствовать началу токена (т. Е. Каждое слово в полном предложении).

Надеюсь, поможет!

person Cartucho    schedule 14.11.2014