gpt4 book ai didi

postgresql - Postgres ts_rank_cd 相同 tsvector 的不同结果?

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

我正在两个独立的数据库服务器上测试文本搜索查询,它们都运行 Postgres 9.4.4。

有问题的行具有相同的数据,我在两台服务器上得到相同的底层 tsvector:

SELECT
user_id,
TO_TSVECTOR('english', REGEXP_REPLACE(first_name, '[^a-zA-Z0-9]', ' ', 'g')) ||
TO_TSVECTOR('english', REGEXP_REPLACE(last_name, '[^a-zA-Z0-9]', ' ', 'g')) ||
TO_TSVECTOR('english', REGEXP_REPLACE(username, '[^a-zA-Z0-9]', ' ', 'g'))
FROM users_v1 where user_id = 123;

-- On server A:
-- user_id | to_tsvector
-- -----------+----------------------
-- 123 | 'georg':1 'hickman':2
-- (1 row)

-- On server B:
-- user_id | to_tsvector
-- -----------+----------------------
-- 123 | 'georg':1 'hickman':2
-- (1 row)

但是,当使用这个向量运行查询时,我得到了不同的排名:

SELECT username,
TS_RANK_CD(
TO_TSVECTOR('english', REGEXP_REPLACE(first_name, '[^a-zA-Z0-9]', ' ', 'g')) ||
TO_TSVECTOR('english', REGEXP_REPLACE(last_name, '[^a-zA-Z0-9]', ' ', 'g')) ||
TO_TSVECTOR('english', REGEXP_REPLACE(username, '[^a-zA-Z0-9]', ' ', 'g'))
, PLAINTO_TSQUERY('george'))
FROM users WHERE user_id = 123;

-- On server A:
-- user_id | ts_rank_cd
-- -----------+----------------------
-- 123 | 0.2
-- (1 row)

-- On server B:
-- user_id | ts_rank_cd
-- -----------+----------------------
-- 123 | 0.0
-- (1 row)

向量是 rank 函数的唯一输入,还是有任何服务器设置/任何其他影响 ts_rank_cd 行为的东西?矢量中存储的所有信息是否都显示在控制台输出中,或者其中是否存在一些我没有看到的隐藏差异?如果不是,是什么导致了差异?

最佳答案

感谢 jjanes 的评论,我意识到 PLAINTO_TSQUERY 也接受一个可选参数来指定文本搜索配置。做

SELECT PLAINTO_TSQUERY('george');

在一个系统上返回 george 而在另一个系统上返回 georg,但是做

SELECT PLAINTO_TSQUERY('english', 'george');

在两者上都返回相同的结果并导致预期的排名。做

SHOW default_text_search_config;

显示 pg_catalog.english 在一个系统上被设置为默认值,而在另一个系统上设置为 pg_catalog.simple。然后可以通过在创建 TSQUERY 时显式传递配置或更新默认配置使它们在两个数据库上相同来修复差异。

关于postgresql - Postgres ts_rank_cd 相同 tsvector 的不同结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32903988/

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