4

約 120 万の名前を持つデータベースがあります。私は Twitter の typeahead.js を使用して、誰かの名前を入力したときにオートコンプリートの候補をリモートで取得しています。私のローカル環境では、入力を止めてから結果が表示されるまでに約 1 ~ 2 秒かかり (入力中はオートコンプリートは表示されません)、Heroku にデプロイされたアプリでは 2 ~ 5 秒以上かかります (1 つの dyno のみを使用)。 )。

入力を止めた後 (そして数秒の遅延) にのみ提案が表示される理由は、私のコードが最適化されていないためでしょうか?

ページ上のスクリプト:

<script type="text/javascript">
$(document).ready(function() {
  $("#navPersonSearch").typeahead({
    name: 'people',
    remote: 'name_autocomplete/?q=%QUERY'
  })
    .keydown(function(e) {
        if (e.keyCode === 13) {
            $("form").trigger('submit');
        }
    });
});
</script> 

キーダウン スニペットは、それがないと、Enter キーを押したときに何らかの理由でフォームが送信されないためです。

私のジャンゴビュー:

def name_autocomplete(request):
    query = request.GET.get('q','')
    if(len(query) > 0):
        results = Person.objects.filter(short__istartswith=query)
        result_list = []
        for item in results:
            result_list.append(item.short)
    else:
        result_list = []

    response_text = json.dumps(result_list, separators=(',',':'))
    return HttpResponse(response_text, content_type="application/json")

私の Person モデルの short フィールドもインデックス化されています。タイプアヘッドのパフォーマンスを向上させる方法はありますか?

4

4 に答える 4

1
        results = Person.objects.filter(short__istartswith=query)
        result_list = []
        for item in results:
            result_list.append(item.short)

おそらくあなたの遅さの唯一の原因ではありませんが、パフォーマンスの観点からはこれは恐ろしいことです.djangoクエリセットを決してループしないでください. django クエリセットからリストを作成するには、常に values_list を使用する必要があります。この特定のケースでは:

        results = Person.objects.filter(short__istartswith=query)
        result_list = results.values_list('short', flat=True)

このようにして、すべてのテーブル行を取得し、そこから Person インスタンスを作成し、最後にそこから単一の属性を読み取るのではなく、必要な単一のフィールドをデータベースから直接取得します。

于 2015-01-19T15:09:29.433 に答える
0

Nitzan はパフォーマンスを改善するための多くの要点をカバーしましたが、彼とは異なり、これは Django (少なくともサーバー側) に直接関係しているのではないかと思います。

これをテストする簡単な方法はname_autocomplete、Typeahead が期待する形式でランダムに生成された 10 個の文字列を返すようにメソッドを更新することです。(ランダムにしたい理由は、Typeahead のキャッシュが結果をゆがめないようにするためです)。

Typeahead の実行速度が非常に速くなりminLength、文字列を入力するとすぐに結果が表示されるはずです。

その場合は、何がクエリを遅くしている可能性があるかを調べる必要があります。私の Python スキルは存在しないため、申し訳ありませんがお手伝いできません。

そうでない場合は、 when$('#navPersonSearch')呼び出しtypeahead:initializedのログを記録typeahead:openedして、何かおかしなことが発生するかどうかを確認することを検討してください。

于 2013-10-20T11:14:04.597 に答える
0

django haystackを使用でき、サーバー側のコードはおおよそ次のようになります。

def autocomplete(request):
sqs = SearchQuerySet().filter(content_auto=request.GET.get('q', ''))[:5]  # or how many names you need
suggestions = [result.first_name for result in sqs]
# you have to configure typeahead how to process returned data, this is a simple example
data = json.dumps({'q': suggestions})  
return HttpResponse(data, content_type='application/json')
于 2013-11-01T18:58:01.810 に答える