Полнотекстовый поиск в Django по релевантности - PullRequest
5 голосов
/ 20 августа 2010

Я использую фильтр запросов Django __search для выполнения полнотекстового поиска, например,

MyModel.objects.filter(title__search = 'some title')

Как мне упорядочить его по релевантности, поскольку в настоящее время он выглядит по алфавиту?

В частности, я хотел бы, чтобы результаты поиска, где заголовок был some title, отображались первыми перед тем, что имело заголовок a different but contains some title.

edit:

What IЯ заметил, что в определении модели для MyModel у меня есть:

class Meta:
    ordering = ['title']

Если я уберу это, то порядок станет правильным, т.е. отсортированным по релевантности.Так есть ли способ, которым я могу оставить это в определении модели как полезное в другом месте, но затем в моем запросе сказать, чтобы он игнорировал это?

Ответы [ 5 ]

3 голосов
/ 20 августа 2010

Как заметил здесь , поиск: Boolean .

Нет такого релевантного коэффициента, который можно использовать для заказа.

A глупая идея может быть упорядочена по длине заголовка, что может иметь смысл.

2 голосов
/ 20 августа 2010

Самый простой способ получить хороший полнотекстовый поиск в проекте Django - использовать превосходное приложение Haystack .Его нелепо легко настроить, особенно если вы используете простейший бэкэнд поисковой системы ( Whoosh , то есть чистый Python).Вы можете настроить полнотекстовое индексирование своего контента, с упорядоченными по релевантности результатами и множеством других полезных функций, кроме того, в считанные минуты.И если вы пересекаете ограничения производительности / параллелизма / функциональности Whoosh, поскольку вы используете Haystack для абстрагирования функций поиска, вы можете в любое время поменять что-то вроде Solr на Whoosh.

0 голосов
/ 29 марта 2011

Этого можно добиться, используя необработанный поиск с предложением ORDER BY для релевантности, если использовать Django> = 1.2

.
File.objects.raw(query_string, params[x,y,z])

Хотя raw_querset на данный момент имеет свои недостатки в том, что, например, не поддерживает count ().

Однако он возвращает модели, поэтому довольно прост в использовании, хотя и не так прост, как __search

0 голосов
/ 20 августа 2010

Попробуйте: Model.objects.all().order_by().search() - вызов order_by без каких-либо параметров не приводит к упорядочению вообще .

Помимо этого: я буду второй рекомендацией Карла о стоге сена, особенно с учетом того, что это позволяет использовать более сложные вещи, такие как stemming («танец» будет соответствовать «танцам», «танцорам» и «танцам»), фасетирование («Показать пользователя» & количество совпадений для каждого результата поиска "), получение объектов, похожих на тот, который вы отображаете в данный момент, и т. д. Когда я в последний раз пытался Whoosh, он был нестабильным (то есть падал при индексации), но это заняло довольно короткий период времени запустить Solr, что здорово.

0 голосов
/ 20 августа 2010

Для результатов поиска, отсортированных по релевантности, потребуется немного больше встроенного логического поиска.Вот два подхода (Sphinxsearch и Whoosh):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...