Джанго "Вы имели в виду?" запрос - PullRequest
3 голосов
/ 24 января 2009

Я пишу довольно простое приложение на Django, где пользователи могут вводить строковые запросы. Приложение выполнит поиск в базе данных по этой строке.

Entry.objects.filter(headline__contains=query)

Этот запрос довольно прост, но не очень полезен для тех, кто не на 100% уверен в том, что ищет. Поэтому я расширил поиск.

from django.utils import stopwords

results = Entry.objects.filter(headline__contains=query)
if(!results):
    query = strip_stopwords(query)
    for(q in query.split(' ')):
        results += Entry.objects.filter(headline__contains=q)

Я бы хотел добавить к этому некоторые дополнительные функции. Поиск пропущенных слов, множественного числа, общих гомофонов (звучат одинаково пишется по-разному), т. Д. Мне просто интересно, были ли какие-либо из этих вещей встроены в язык запросов Djangos. Мне не важно писать огромный алгоритм, потому что я просто ищу что-то встроенное.

Заранее спасибо за все ответы.

Ответы [ 2 ]

11 голосов
/ 24 января 2009

Вы можете попробовать использовать модуль Python difflib .

>>> from difflib import get_close_matches
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

Проблема в том, что для использования difflib необходимо составить список слов из базы данных. Это может быть дорого. Возможно, если вы кешируете список слов и перестраиваете его время от времени.

Некоторые системы баз данных поддерживают метод поиска, чтобы делать то, что вы хотите, например, модуль fuzzystrmatch PostgreSQL. Если это ваш случай, вы можете попробовать позвонить.


редактирование:

Для вашего нового "требования", ну, вам не повезло. Нет, в языке запросов django нет ничего встроенного.

5 голосов
/ 24 января 2009

djangos orm не имеет такого поведения из коробки, но есть несколько проектов, которые интегрируют django с поисковыми сервисами, например:

Я не могу сказать, насколько хорошо работают опции # 2 и # 3, но я довольно часто использовал django-sphinx и очень доволен результатами.

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