2017-07-14 22 views
2

Djangoでワイルドカードを使用することはできますか?それが唯一のフル単語に一致した瞬間Django - 全文検索 - ワイルドカード

https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/

 post = request.POST.get('search') 
     query = SearchQuery(post) 
     vector = SearchVector('headline', weight='A') + SearchVector('content', weight='B') 
     rank = SearchRank(vector, query, weights=[0.1,0.2]) 
     data = wiki_entry.objects.annotate(rank=SearchRank(vector,query)).filter(rank__gte=0.1).order_by('-rank') 

*%|のような文字&は効果がありません。

または私はicontainsに戻る必要がありますか?

https://docs.djangoproject.com/en/1.11/ref/models/querysets/#icontains

すべてのヘルプは

答えて

2

を高く評価している[Postgresの部分] Postgresのマニュアルは、この短時間だけ(https://www.postgresql.org/docs/current/static/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES)を言及していますが、ちょうど前方一致が必要な場合ははい、それは、可能です:

test=# select to_tsvector('abcd') @@ to_tsquery('ab:*'); 
?column? 
---------- 
t 
(1 row) 


test=# select to_tsvector('abcd') @@ to_tsquery('ac:*'); 
?column? 
---------- 
f 
(1 row) 

そして、このようなクエリはGINインデックスを利用します(あなたが持っていると仮定します)。

[Djangoの一部]私は、Djangoのユーザーではないので、私は、迅速な調査をしたと、残念ながら、Djangoはplainto_tsquery()機能、ないto_tsquery()使用する、ことを発見:あなただけのプレーンテキストを使用する場合、https://docs.djangoproject.com/en/1.11/_modules/django/contrib/postgres/search/#SearchQuery簡単にするために作られた

plainto_tsquery()を - 入力として、それは高度なクエリをサポートしていませんので、この場合にはそう

test=# select to_tsvector('abcd') @@ plainto_tsquery('ab:*'); 
?column? 
---------- 
f 
(1 row) 

test=# select to_tsvector('abcd') @@ plainto_tsquery('ac:*'); 
?column? 
---------- 
f 
(1 row) 

を、私はto_tsquery()とプレーンなSQLを使用して、あなたをお勧めします。しかし、テキスト入力からすべての特殊文字(&または|など)を除外したことを確認する必要があります。そうでない場合は、to_tsquery()が間違った結果またはエラーを生成します。もし可能であれば、to_tsquery()で作業する能力を持つdjango.contrib.postgres.searchを拡張してください(これは大きな貢献です、btw)。

代替は、以下のとおりです。

  • あなたのデータはACSIIのみであれば、あなたはケース非感受性を必要とする場合は、機能的に使用プレフィックスの検索やtext_pattern_ops/varchar_pattern_ops演算子クラスで作成したB-treeインデックス(とLIKEを使用することができますlower(column_name)およびlower(column_name) like '...%'を超えるインデックス; https://www.postgresql.org/docs/9.6/static/indexes-opclass.htmlを参照)。
  • 正規表現とGiST/GINインデックスをサポートするpg_trgm index(https://www.postgresql.org/docs/9.6/static/pgtrgm.html