Simple Django queryset __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