2017-07-14 127 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) 

因此,在這種情況下,我建議你使用普通的SQL與to_tsquery()。但是您需要確保從文本輸入中濾除了所有特殊字符(如&|),否則to_tsquery()將產生錯誤結果甚至錯誤。或者,如果可以的話,可以使用to_tsquery()來擴展django.contrib.postgres.search(這將是很大的貢獻,順便說一句)。

,選項爲: