19

我已经被征召来帮助一个项目,并且在几年没有使用 PostgreSQL 之后我又重新开始使用它。除了缺乏使用外,我以前从未使用过 tsvector 字段,现在发现自己面临基于它们的错误。我阅读了有关字段类型及其用途的文档,但我很难挖掘有关“简单”与“英语”作为 to_tsquery() 的第一个参数有何不同的文档

例子

> SELECT to_tsvector('mortgag') @@ to_tsquery('simple', 'mortgage')
?column? 
----------
 f
(1 row)

> SELECT to_tsvector('mortgag') @@ to_tsquery('english', 'mortgage')
?column? 
----------
 t
(1 row)

我认为他们都应该返回 true,但显然第一个没有 - 为什么?

4

1 回答 1

30

FTS 使用字典来规范化文本:

12.6。字典

字典用于消除不应在搜索中考虑的单词(停用词),并规范化单词,以便相同单词的不同派生形式匹配。成功规范化的词称为词素

因此,字典被用来丢弃那些在搜索中太常见或无意义的东西(停用词),并规范化其他所有内容,例如citycity将匹配,即使它们是不同的词。

让我们看看一些输出ts_debug,看看字典发生了什么:

=> select * from ts_debug('english', 'mortgage');
   alias   |   description   |  token   |  dictionaries  |  dictionary  |  lexemes  
-----------+-----------------+----------+----------------+--------------+-----------
 asciiword | Word, all ASCII | mortgage | {english_stem} | english_stem | {mortgag}

=> select * from ts_debug('simple', 'mortgage');
   alias   |   description   |  token   | dictionaries | dictionary |  lexemes   
-----------+-----------------+----------+--------------+------------+------------
 asciiword | Word, all ASCII | mortgage | {simple}     | simple     | {mortgage}

请注意,simple使用simple字典而english使用english_stem字典。

simple字典:_

通过将输入标记转换为小写并根据停用词文件检查它来进行操作。如果在文件中找到它,则返回一个空数组,导致令牌被丢弃。如果不是,则返回单词的小写形式作为规范化的词素。

simple字典只是抛出停用词、小写字母,仅此而已。我们自己可以看到它的简单性:

=> select to_tsquery('simple', 'Mortgage'), to_tsquery('simple', 'Mortgages');
 to_tsquery | to_tsquery  
------------+-------------
 'mortgage' | 'mortgages'

simple字典太简单了,甚至无法处理简单的复数。

那么这本english_stem词典到底是关于什么的呢?“词干”后缀是一个赠品:这本词典将词干算法应用于单词,以将(例如)城市城市转换为相同的事物。来自精美手册

12.6.6。雪球词典

Snowball 词典模板基于 Martin Porter 的一个项目,Martin Porter 是流行的 Porter 英语词干算法的发明者。[...] 每个算法都了解如何将常见的单词变体形式简化为其语言中的基本拼写或词干拼写。

就在下面,我们看到了english_stem字典:

CREATE TEXT SEARCH DICTIONARY english_stem (
    TEMPLATE = snowball,
    Language = english,
    StopWords = english
);

所以english_stem字典中的词干,我们可以看到发生这种情况:

=> select to_tsquery('english', 'Mortgage'), to_tsquery('english', 'Mortgages');
 to_tsquery | to_tsquery 
------------+------------
 'mortgag'  | 'mortgag'

执行摘要'simple'意味着简单的文字匹配,'english'将词干应用于(希望)产生更好的匹配。阻止将抵押贷款变成抵押贷款,这为您提供了匹配。

于 2012-05-25T02:00:03.583 回答