Django psql全文搜索不匹配非词干词

rya*_*bin 5 django postgresql full-text-search

我正在对Postgres 9.4运行Django 1.10.1.我的登台服务器和开发环境具有版本9.4.9的psql服务器,生产是9.4.7的RDS实例.

看起来我的SearchVectorField没有存储生产中给出的搜索配置,虽然它是在staging和dev中,它似乎是一个版本的东西(不太可能,鉴于版本差异,它也在staging/dev上工作在9.3) )或生产在服务器上的RDS而不是本地的事实.

我正在使用自定义配置进行全文搜索调用unaccent,如下所示:

      Token      |     Dictionaries      
-----------------+-----------------------
 asciihword      | english_stem
 asciiword       | english_stem
 email           | simple
 file            | simple
 float           | simple
 host            | simple
 hword           | unaccent,english_stem
 hword_asciipart | english_stem
 hword_numpart   | simple
 hword_part      | unaccent,english_stem
 int             | simple
 numhword        | simple
 numword         | simple
 sfloat          | simple
 uint            | simple
 url             | simple
 url_path        | simple
 version         | simple
 word            | unaccent,english_stem
Run Code Online (Sandbox Code Playgroud)

Unaccent安装在两个环境中,适用于两种环境.

我将搜索数据存储django.contrib.postgres.search.SearchVectorField在我的Writer模型中:

class Writer(models.Model):
    #...
    search = SearchVectorField(blank=True)
Run Code Online (Sandbox Code Playgroud)

该列使用以下搜索向量进行更新:

writer_search_vector = (SearchVector('first_name', 'last_name', 'display_name',
                                     config='unaccent', weight='A') +
                        SearchVector('raw_search_data', config='unaccent', weight='B'))
Run Code Online (Sandbox Code Playgroud)

通过以下声明定期运行:

Writer.objects.update(search=search_utils.writer_search_vector)
Run Code Online (Sandbox Code Playgroud)

并且,由于某种原因,配置成功存储在我的登台服务器和开发人员中,但不在生产中.例如,此代码在所有环境中返回相同的结果:

In [3]: Writer.objects.annotate(searchy=SearchVector('last_name')).filter(searchy='kostenberger')
Out[3]: <QuerySet []>
In [4]: Writer.objects.annotate(searchy=SearchVector('last_name', config='unaccent')).filter(searchy='kostenberger')
Out[4]: <QuerySet [<Writer: Andreas J. Köstenberger>, <Writer: Margaret Elizabeth Köstenberger>]>
Run Code Online (Sandbox Code Playgroud)

但是在暂存时,如果我使用存储的向量,我会得到以下正确的结果:

In [5]: Writer.objects.filter(search='kostenberger')
Out[5]: <QuerySet [<Writer: Andreas J. Köstenberger>, <Writer: Margaret Elizabeth Köstenberger>]>
Run Code Online (Sandbox Code Playgroud)

在生产中,针对RDS实例,我得到以下结果:

In [5]: Writer.objects.filter(search='kostenberger')
Out[5]: <QuerySet []>
Run Code Online (Sandbox Code Playgroud)

然而,在生产仍然,unaccent工作,但english_stem没有,因为它将匹配文本的词干版本(下面),但不是原始版本(上面):

In [6]: Writer.objects.filter(search='kostenberg')
Out[6]: <QuerySet [<Writer: Margaret Elizabeth Köstenberger>, <Writer: Andreas J. Köstenberger>]>
Run Code Online (Sandbox Code Playgroud)

请注意,两个环境中Writer的数据库表对于此测试是相同的.

任何想法为什么存储的矢量在生产中没有正确的配置,而如果我在运行中创建矢量它将工作?

Dav*_*Eyk 3

在 RDS Postgres 上,您不允许更改该default_text_search_config参数。因此,您必须为每个查询配置文本搜索:

\n\n
from django.contrib.postgres.search import SearchRank, SearchQuery\n\xe2\x80\xa6\nsearch_query = SearchQuery(value='kostenberger', config='unaccent')\nWriter.objects.filter(search=search_query)\n
Run Code Online (Sandbox Code Playgroud)\n