简单的Django queryset __icontains搜索将首先找到大多数特定元素

时间:2011-01-28 02:59:47

标签: python django django-queryset

我正在使用__ictonains在CharField中为“foo”做一个查询集过滤器,我想先找到最具体的搜索匹配。

数据库中某个名为“description”的字段的数据集:

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

当我搜索:

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

queryset根据id号(或其他因素?)以某种顺序返回结果:

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

如果我只显示前5个结果,我将省略“foo”,这实际上是我想先显示的最佳匹配。如果不实施像Lucene这样的“真正的重型”搜索引擎,我怎样才能以更简单的方式为更好的匹配提供更高的权重?我想要一个更简单的查询集过滤器黑客。

这是一个文本数据集的原始搜索引擎,因为在显示前N个结果时首先显示foo更重要的原因是如果该人正在寻找foobariffic,他们可以输入更多字母。但如果被更长的条目取代,就无法通过输入更多的字母来获得“foo”。

1 个答案:

答案 0 :(得分:2)

如果它是一个小字段,您可以按字段长度排序并获得良好的结果。

鉴于匹配,最短的结果是最难和最重要的匹配。当然不适用于全文...

我很乐意为自动填充用户名或代码字段执行此操作。

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')