Простой набор запросов Django __icontains поиск, который сначала найдет наиболее конкретные элементы

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

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

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», набрав больше букв, если оно замещено более длинными записями.


person MikeN    schedule 28.01.2011    source источник
comment
Я настоятельно рекомендую вам заглянуть на сайт haystack haystacksearch.org. Он очень прост в использовании, прост в настройке (бэкенд Whoosh — это чистый python, без бинарных пакетов) и достаточно мощный. Имеет несколько приятных утилит, таких как выделение поискового запроса. Поставляется с видом поиска, формой и URL-адресами. Представление основано на классах и очень легко расширяется. Если вам не хватает производительности с Whoosh, легко переключиться на серверную часть на основе xapian.   -  person Ski    schedule 28.01.2011


Ответы (1)


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

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

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

foo
bofoo
foobar
barfood

Сортировка Python

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

Или в SQL

MyModel.objects.extra(select={'myfield_length':'Length(myfield)'}).order_by('myfield_length') 
person Yuji 'Tomita' Tomita    schedule 28.01.2011
comment
Спасибо! Как раз то, что я искал! - person MikeN; 28.01.2011