2013-02-21 20 views
8

全単語にのみ一致するDjangoクエリを作成しようとしています。答えhereに基づいて、私のような何か試してみた:Djangoクエリでのみ全単語一致

result = Model.objects.filter(text__iregex='\bsomeWord\b') 

をしかし、これは予想される結果を返すされていません。私も試しました

result = Model.objects.filter(text__iregex=r'\bsomeWord\b') 

いいえ利用できません。

result = Model.objects.filter(text__iregex=r'\b'+stringVariable+r'\b') 

または

result = Model.objects.filter(text__iregex=r'\b %s \b'%stringVariable) 

しかし、今、私もそれが生の文字列で動作するように取得することはできません:私の最終目標は、同様に文字列変数にのようなものを渡すことができるようにすることです。私はPostgreSQLを使用しています。

+0

どのデータベースをお使いですか? – Matt

+0

@MattStevens、私はPostgreSQLを使用しています。 – GChorn

答えて

11

使用あなたは、PostgreSQLを使用しているとき、DjangoはまっすぐのPostgreSQLへの正規表現を渡すので、これはある - それと互換性を持つようにするので、あなたの正規表現の必要性。 psqlから問題なく実行できるはずです。

result = Model.objects.filter(text__iregex=r"\y{0}\y".format(stringVariable)) 

参照:http://bit.ly/ZtpojU

+1

正確に '\ y'とは何ですか? –

+0

DjangoはPCREをPostgreSQLの正規表現に変換することはありません(http://bit.ly/ZtpbgH参照)。したがって、PostgreSQLのネイティブ正規表現を使用するだけです。http://bit.ly/ZtpojU – Matt

+0

これは動作します。 '\ y'についての説明を追加してくれてありがとう。 ''{0}'。format(stringVariable)'部分に関しては、 '%s '%stringVariable'を書くもう一つの方法ですか?どちらも私のために働くようです。 – GChorn

1

あなたは正規表現をドロップし、いくつかのDjangoの検索ドキュメントのための

result = Model.objects.filter(Q(text__contains=' someword ') | 
           Q(text__contains=' someword.') | 
           Q(text__istartswith = 'someword.' | 
           Q(text__istartswith = 'someword.' | 
           Q(text__iendswith = 'someword') 

参照hereを使って何かを得ることができるかもしれません。

私はそれがとてもエレガントではないことを認識しています(ただし、正規表現のファンでなければ簡単にメンテナンスができます)。 「 B \ 」の代わりに「Y \

+1

これは全単語一致を実行しないためです。例えば、 'text__contains = 'tart''を実行すると、' start'のような結果が得られます。 – GChorn

+0

私の悪い - 私は明らかにSQLに精通していないので、 '全体の単語一致'は何か特定の意味を知っています。とにかく、私はそれを少し改善するために私の答えを更新しました。 –

+0

メンテナンスは簡単ですか?あなたがそこでカバーしていないケースがたくさんあります( '() '、カンマなど)。 –

0

私はPerl互換のエスケープシーケンス\ bを使って単語の境界と一致するようにしようと同じ問題を抱えていました。私のバックエンドデータベースはMySQLです。

文字クラス表現[[:space:]]で問題を解決しました。

 q_sum = Q() 
     search_list = self.form.cleaned_data['search_all'].split(' '); 
     for search_item in search_list: 
      search_regex = r"[[:space:]]%s[[:space:]]" % search_item 
      q_sum |= Q(message__iregex=search_regex) 
     queryset = BlogMessages.objects.filter(q_sum).distinct() 
+0

これはちょうどあなたが知っているので句読点を説明しません。 – yekta

関連する問題