2011-01-28 5 views
0

__ictonainsを使用してCharFieldで "foo"のクエリーセットフィルターを実行しています。 「説明」という名前の特定のフィールドのデータベース内シンプルなDjangoクエリーセット最も具体的な要素を最初に探す__icontains検索

データセット:私は検索すると

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

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

クエリセットは、ID番号(または他のに応じて、いくつかのために結果を返します要因:?):

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

私がトップ5の結果のみを表示する場合は、「fこれは実際に私が最初に見せたいベストマッチです。 Luceneのような「本当に重い義務の」検索エンジンを実装しなくても、簡単な方法でより良いマッチに高い重みを与えることができますか?私はより簡単なクエリーセットフィルタのハッキングが必要です。

これは、テキストデータセットの粗雑な検索エンジンです。なぜなら、上位N個の結果のみを表示するときにfooを表示することが重要である理由は、人がfoobarifficを探していた場合、より多くの文字を入力できることです。しかし、より長い文字列に置き換えられた場合、より多くの文字を入力することによって "foo"を得る方法はありません。

+0

私は強くあなたが干し草の山の中にhttp://haystacksearch.org/を見てお勧めします。それは非常に使いやすく、構成が簡単です(Whooshバックエンドは純粋なPythonでありバイナリパッケージではありません)、非常に強力です。検索クエリを強調表示するような素敵なユーティリティがあります。検索ビュー、フォーム、およびURLが付属しています。ビューはクラスに基づいており、非常に簡単に拡張できます。 Whooshでパフォーマンスが不足している場合は、xapianベースのバックエンドに切り替えるのは簡単です。 – Ski

答えて

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

ありがとう!ちょうど私が探していたもの! – MikeN

+0

うれしかった:) –

関連する問題