我正在对Postgres 9.4运行Django 1.10.1。我的登台服务器和开发环境的psql服务器版本为9.4.9,生产版本是9.4.7的RDS实例。
似乎我的SearchVectorField没有存储生产中给出的搜索配置,虽然它在staging和dev中,它似乎是一个版本的东西(不太可能,鉴于版本差异,它也适用于9.3 in staging / dev)或生产在服务器上的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
Unaccent安装在两种环境中,适用于两种环境。
我将搜索数据存储在django.contrib.postgres.search.SearchVectorField
模型的Writer
上:
class Writer(models.Model):
#...
search = SearchVectorField(blank=True)
使用以下搜索向量更新该列:
writer_search_vector = (SearchVector('first_name', 'last_name', 'display_name',
config='unaccent', weight='A') +
SearchVector('raw_search_data', config='unaccent', weight='B'))
通过以下语句定期运行:
Writer.objects.update(search=search_utils.writer_search_vector)
并且,由于某种原因,配置成功存储在我的登台服务器和dev中,但不在生产中。例如,此代码在所有环境中返回相同的结果:
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>]>
但是在分期中,如果我使用存储的矢量,我会得到以下正确的结果:
In [5]: Writer.objects.filter(search='kostenberger')
Out[5]: <QuerySet [<Writer: Andreas J. Köstenberger>, <Writer: Margaret Elizabeth Köstenberger>]>
在生产中,针对RDS实例,我得到以下结果不正确:
In [5]: Writer.objects.filter(search='kostenberger')
Out[5]: <QuerySet []>
然而,在生产中,unaccent仍然有效,但是english_stem没有,因为它将匹配文本的词干版本(下面),但不是原始版本(上图):
In [6]: Writer.objects.filter(search='kostenberg')
Out[6]: <QuerySet [<Writer: Margaret Elizabeth Köstenberger>, <Writer: Andreas J. Köstenberger>]>
请注意,两个环境中Writer的数据库表对于此测试是相同的。
为什么存储的矢量在生产中没有使用正确的配置的任何想法,而如果我在运行中创建矢量它将起作用?
答案 0 :(得分:2)
在RDS Postgres上,您不能更改default_text_search_config
参数。因此,您必须使用每个查询配置文本搜索:
from django.contrib.postgres.search import SearchRank, SearchQuery
…
search_query = SearchQuery(value='kostenberger', config='unaccent')
Writer.objects.filter(search=search_query)