8

検索システムを構築しようとしていますname, state, city,が、django モデルの複数のフィールドで検索したいと考えています。以下のコードを書きましたが、どうすればいいのかわかりません。

モデル:

class Finhall(models.Model):
     user=models.ForeignKey(User)
     name=models.CharField(max_length=250, unique=True)
     address=models.CharField(max_length=200)
     city=models.CharField(max_length=200)
     state=models.CharField(max_length=200)

     def __unicode__(self):
         return u'%s' % (self.name)

Views.py

def hup_find(request):
    if ('q' in request.GET) and request.GET['q'].strip():
        query_string=request.GET.get('q')
        seens=Finhall.objects.filter(name__icontains=query_string)
    else:
        seens=None
    return render_to_response('find.html',{'seens':seens},context_instance=RequestContext(request))

テンプレート:

 {% block content %}
     <body>
    <form action="" method="GET">
    <input type="text" name="q" />
    <button type="submit">search</button>
   </form>


    {% for seen in seens %}

    <p> {{seen.name}}</p>

    {% empty %}

      <p> no search </p>
    {% endfor %}

 </body>

   {% endblock %}

これについてどうすればよいですか?個人的な理由から、haysatck を使用したくありません。

4

4 に答える 4

17

djangoQオブジェクトを使用してORクエリを実行できます。

または、クエリを一緒にしたい場合ANDは、現在のルックアップを kwargs として使用するだけです

seens = Finhall.objects.filter(
  name__icontains=query_string, 
  address__icontains=query_string
)

リモートでスケーラブルではない問題があるため、全文検索またはhaystack(検索が簡単になります)を実際に検討する必要がありますicontains%LIKE%

于 2013-04-30T15:44:34.690 に答える
10

編集:Postgresのみであることに気付きました

どうやらdjango 1.10でSearchVectorクラスが追加されました。

ドキュメントからの使用法:

単一のフィールドに対する検索は優れていますが、むしろ制限があります。検索している Entry インスタンスは、タグライン フィールドを持つブログに属しています。両方のフィールドに対してクエリを実行するには、SearchVector を使用します。

>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
于 2016-10-26T18:20:12.173 に答える
1

Robin Nemethが示唆したように、postgres db を使用している場合は、SearchVector を使用できます (質問に直接答えているだけです。詳細については、django のドキュメントを参照してください)。

最初に に追加django.contrib.postgresすると、INSTALLED_APPSPostgreSQL の全文検索エンジンを活用するのに役立ちます。

検索のviews.pyで、

from django.contrib.postgres.search import SearchVector


# view function
def hup_find(request):
  search_vector = SearchVector('name', 'state', 'city')

  if ('q' in request.GET) and request.GET['q'].strip():
    query_string=request.GET['q']
    seens = Findhall.objects.annotate(
                search=search_vector).filter(search=query_string)

  return render(request, 'find.html', {'seens':seens})

大規模なデータベースの場合、検索プロセスに時間がかかります。postgresql の GIN-(Generalized Inverted Index) 機能を使用してパフォーマンスを向上させることができます. これらは公式ドキュメント以外のいくつかの役立つリンクです,

見つかった別のアプローチがあります。Julien Phalipによるより pythonish な方法で検索を採用していると思います。

于 2020-09-15T06:54:27.303 に答える