gpt4 book ai didi

Django psql 全文搜索不匹配未词干的词

转载 作者:行者123 更新时间:2023-11-29 11:29:39 27 4
gpt4 key购买 nike

我正在针对 Postgres 9.4 运行 Django 1.10.1。我的暂存服务器和开发环境有版本为 9.4.9 的 psql 服务器,生产环境是版本为 9.4.7 的 RDS 实例。

似乎我的 SearchVectorField 没有存储生产中给出的搜索配置,尽管它在暂存和开发中,而且它似乎是版本问题(不太可能,考虑到版本差异并且它也适用于 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 在两种环境中都安装,并且在两种环境中都可以工作。

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

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)

而且,出于某种原因,配置成功存储在我的暂存服务器和开发中,但没有存储在生产中。例如,此代码在所有环境中返回相同的结果:

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 的数据库表是相同的。

为什么存储的矢量在生产环境中无法使用正确的配置工作,而如果我动态创建矢量它会工作,有什么想法吗?

最佳答案

在 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)

关于Django psql 全文搜索不匹配未词干的词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39458965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com