试图弄清楚为什么下面的查询没有返回任何结果:
select id from story where tsv_story_text @@ to_tsquery('CumEx-Files<->2.0');
该术语存在于数据库(PostgreSQL 11.12)中一个故事的标题中,例如:
CumEx-Files 2.0 investigation reveals €150bn tax fraud
我可以让查询工作的唯一方法是在向量和有效的查询中用破折号替换连字符,所以我尝试调试这个短语,但似乎连字符只是一个空格符号 - 我认为它必须对短语中的数字做些什么,或者是吗?
SELECT * FROM ts_debug('english', 'CumEx-Files<->2.0');
alias | description | token | dictionaries | dictionary | lexemes
-----------------+---------------------------------+-------------+----------------+--------------+-------------
asciihword | Hyphenated word, all ASCII | CumEx-Files | {english_stem} | english_stem | {cumex-fil}
hword_asciipart | Hyphenated word part, all ASCII | CumEx | {english_stem} | english_stem | {cumex}
blank | Space symbols | - | {} | |
hword_asciipart | Hyphenated word part, all ASCII | Files | {english_stem} | english_stem | {file}
blank | Space symbols | < | {} | |
blank | Space symbols | -> | {} | |
float | Decimal notation | 2.0 | {simple} | simple | {2.0}
Postgres 14 中的行为发生了变化。(实际上是一个修复,但没有回补,因为行为的变化......)
Postgres 14的发行说明:
修复
to_tsquery()
并websearch_to_tsquery()
正确解析包含丢弃标记的查询文本 (Alexander Korotkov)某些丢弃的标记,如下划线,导致这些函数的输出产生不正确的 tsquery 输出,例如,both
websearch_to_tsquery('"pg_class pg"')
和to_tsquery('pg_class <-> pg')
used to output( 'pg' & 'class' ) <-> 'pg'
,但现在都 output'pg' <-> 'class' <-> 'pg'
。这正是你的情况。比较以下两个小提琴中的结果:
db<>fiddle here - Postgres 11
db<>fiddle here - Postgres 14
所以你的查询:
... 现在可以在 Postgres 14 或更高版本中按预期工作(返回
true
)。考虑升级。