部分匹配PostgreSQL全文搜索

时间:2017-06-05 17:50:37

标签: python django postgresql full-text-search

PostgreSQL全文搜索的

Django's documentation使用以下示例:

>>> Entry.objects.filter(body_text__search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]

我想使用它,但是通过只搜索单词的一部分来获得相同的结果。目前,这没有结果:

>>> Entry.objects.filter(body_text__search='Chee')
[]

基本上我希望得到与body_text__icontains相同的结果。我想使用全文搜索,以便在我开始工作之后,我可以利用诸如可重复使用的搜索向量,加权查询和排名之类的东西。

是否有某种方法可以通过部分字词查询获得结果?

1 个答案:

答案 0 :(得分:2)

django.contrib.postgres.search module已在PotgreSQL's full-text search engine上实施。

具体来说,它将文本值转换为PostgreSQL“tsvector”值,并将搜索词转换为PostgreSQL“tsquery”值。因此,如果您正在使用此功能,则应了解how to search using tsquery

你给出的例子在PostgreSQL中说明如下:

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Cheese'::tsquery;
 ?column? 
----------
 t
(1 row)

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Chees'::tsquery;
 ?column? 
----------
 f
(1 row)

因此,'Chees'的tsquery与文本不匹配。 Django正在告诉你正确的事情。

匹配的tsquery的示例是'Chees:*'

=> SELECT 'Cheese on Toast recipes'::tsvector @@ 'Chees:*'::tsquery;
 ?column? 
----------
 t
(1 row)

更大的答案是:如果您想正确使用此功能,您需要了解如何按照PostgreSQL期望的方式形成全文搜索查询: - )