Postgres ts_rank_cd 相同 tsvector 的不同结果?
Postgres ts_rank_cd different result for same tsvector?
我正在两个单独的数据库服务器上测试文本搜索查询,两者都是 运行ning 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)
向量是排名函数的唯一输入,还是有其他服务器 settings/anything 影响 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 时显式传递配置或更新默认配置使它们在两个数据库上相同来修复差异。
我正在两个单独的数据库服务器上测试文本搜索查询,两者都是 运行ning 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)
向量是排名函数的唯一输入,还是有其他服务器 settings/anything 影响 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 时显式传递配置或更新默认配置使它们在两个数据库上相同来修复差异。