首页 > 解决方案 > Postgresql 全文匹配意外

问题描述

查看以下查询:

1. select to_tsvector('xyz-abc-testbed') @@ to_tsquery('abc')  # true
2. select to_tsvector('xyz/xyz-abc-testbed') @@ to_tsquery('abc')  # false

然后我意识到:

select to_tsvector('xyz-abc-testbed')
   to_tsvector
----------------------------------------------
'abc':3 'testb':4 'xyz':2 'xyz-abc-testb':1

select to_tsvector('xyz/xyz-abc-testbed')
   to_tsvector
----------------------------------------------
'xyz/xyz-abc-testbed':1

看起来“/”对 to_tsvector 的结果影响很大。但我在 PG 文档中找不到解释。

请解释 '/' 如何影响 tv_tsvector 或指出一些解释这一点的文档。提前致谢。

标签: postgresql

解决方案


全文搜索处理的第一步是解析器,它将字符串拆分为标记并使用启发式方法为它们分配类型。进一步处理取决于类型。

该函数ts_debug对于分析正在发生的事情很有用:

SELECT alias, description, lexemes
FROM ts_debug('xyz/xyz-abc-testbed');

 alias |    description    |        lexemes        
-------+-------------------+-----------------------
 file  | File or path name | {xyz/xyz-abc-testbed}
(1 row)

SELECT alias, description, lexemes
FROM ts_debug('xyz-abc-testbed');

      alias      |           description           |      lexemes      
-----------------+---------------------------------+-------------------
 asciihword      | Hyphenated word, all ASCII      | {xyz-abc-testbed}
 hword_asciipart | Hyphenated word part, all ASCII | {xyz}
 blank           | Space symbols                   | 
 hword_asciipart | Hyphenated word part, all ASCII | {abc}
 blank           | Space symbols                   | 
 hword_asciipart | Hyphenated word part, all ASCII | {testbed}
(6 rows)

PostgreSQL 将其中的字符串解释/为文件路径。它不会像处理连字符的单词那样将文件路径分成几部分。


推荐阅读