Простой набор запросов Django __icontains поиск, который сначала найдет наиболее конкретные элементы - PullRequest
0 голосов
/ 28 января 2011

Я делаю фильтр набора запросов для "foo" в CharField с использованием __ictonains и хочу сначала найти наиболее конкретные совпадения поиска.

Набор данных в базе данных для определенного поля с именем "description":

fooal;skdjfkasdgh;alskdjrf
foobar
foo-nstastical
foobariffic
foo-ntastic
foo

Когда я ищу:

MyModel.objects.filter(description__icontains="foo")

Набор запросов возвращает результаты в некотором порядке в соответствии с номером идентификатора (или другими факторами?):

fooal;skdjfkasdgh;alskdjrf
foobar
foo-nstastical
foobariffic
foo-ntastic

Если я покажу только 5 лучших результатов, я пропущу "foo", который на самом деле является лучшим совпадением, которое я хочу показать первым. Как я могу простым способом придать больший вес лучшим матчам, не внедрив поисковую систему "по-настоящему тяжелого режима", такую ​​как Lucene? Я хочу более легкий взлом фильтра запросов.

Это грубая поисковая система для набора текстовых данных, поэтому более важно сначала показать foo, когда отображаются только первые N результатов, потому что, если человек искал foobariffic, он мог набирать больше букв. Но нет способа получить "foo", набрав больше букв, если они заменяются более длинными записями.

1 Ответ

2 голосов
/ 28 января 2011

Если это небольшое поле, вы можете потенциально отсортировать по длине поля и получить хорошие результаты.

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

Мне было бы удобно сделать это для автозаполнения имени пользователя или поля тега.1010 *

# python sort
x = [results]
x.sort(key=len)

Или в SQL

MyModel.objects.extra(select={'myfield_length':'Length(myfield)'}).order_by('myfield_length') 
...