我正在使用__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”。
答案 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')