PostgreSQL8.3.X新特性-全文搜索(四)

本文介绍了PostgreSQL 8.3.X中全文搜索的新特性,包括词典的使用、规范化过程、屏蔽词的作用及不同词典如Ispell、Snowball的应用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 PostgreSQL8.3.X新特性-全文搜索(四)

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

 

词典

字典用于删除那些不应该在搜索中出现的词(屏蔽词)、以及规范化一些有多重形式的词,这样同一个词的不同的衍申结果也可以被搜索到。成功规范化之后的词被称作语意(lexeme)。除了改进搜索质量,规范化和删除屏蔽词可以减少 tsvector 形式的文档的尺寸,因此也可以提高性能。规范化并不总是有语言含义,通常是取决于应用的语意的。

一些规范化的例子:

  • 语言学 - Ispell (拼写)字典试图把输入的词缩约成一个规范的形式;词干字典删除单词的尾缀
  • URL 位置可以标准化为等效的 URL 匹配:
  • 颜色名字可以替换成它们等效的十六进制值,比如:红,绿,蓝,紫红 -> FF0000,00FF00,0000FF,FF00FF
  • 如果索引数字,我们可以删除一些小数位,以减少可能的数字范围。所以,如果我们只保留小数点后两位,那么像 3.14159265359,3.1415926,3.14 在规范化之后都会是一样的。

一个字典是这样的东西,它接受记号的输入,然后返回:

  • 如果输入记号是字典认识的,就输出一个语意(lexeme)的数组(请注意一个记号可以生成多个语意)
  • 如果字典认识输入的记号,并且它是屏蔽词,那就是一个空数组
  • 如果字典不识别输入的记号,那就是 NULL

PostgreSQL 为许多语言都提供了预定义的词典。还有好多预定义的模版,可以用于试用客户化参数创建新的词典。每个预定义的词典都在下面描述。如果没有现成的合适模版,我们可以创建一个新的;参阅 PostgreSQL 源代码的 contrib/ 目录获取样例。

一个文本搜索配置会把一个分词程序和一堆试用分词程序输出的记号的词典绑定在一起。对于分词程序能返回的每个记号类型,配置都会声明一个独立的词典列表。如果分词程序发现对应的记号类型,那么在列表中的词典会轮流进行查询,直到某个词典识别出它是一个已知的单词。如果它被识别为是一个屏蔽词,或者如果没有什么词典认识这个极好,那么它就会被抛弃,因此也不会被索引,也就不会被找到了。配置一系列词典的通用规则是把最狭窄,最专用的词典放在最先,然后是更普通的词典,最后是最通用的词典,比如一个 Snowball 词干或者是 simple,它们可以识别一切的东西。比如,对于一个天文学相关的搜索(astro_en 配置),我们可以把记号类型 asciiword (ASCII 单词)绑定到一个天文学术语的同义词典、一个通用英语词典和一个 Snowball 英语词干上:

  ALTER TEXT SEARCH CONFIGURATION astro_en
      ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem;
[编辑] 屏蔽词(Stop Words)

屏蔽词是那些非常常见的词,几乎在所有文档中都出现,并且没有歧视值。因此,它们可以在全文搜索的环境中忽略掉。比如,每个英文文本都几乎包含 a 和 the,因此在索引里面存储它们是没有任何意义的。不过,屏蔽词会影响 tsvector 里面的位置,因此也会间接地影响相关性:

SELECT to_tsvector('english','in the list of stop words');
        to_tsvector
----------------------------
 'list':3 'stop':5 'word':6


缺失的位置 1,2,4 都是因为屏蔽词造成的。有和没有屏蔽词计算出来的相关性的差别是相当大的:

SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
       0.05

SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop'));
 ts_rank_cd
------------
        0.1

如何对待屏蔽词是由具体的词典来决定的。比如,ispell 词典首先规范化单词,然后查看屏蔽词列表,而 Snowball 词干首先检查屏蔽词列表。这样的不同的行为的原因是为了减少噪音。

[编辑] simple 词典

simple 词典模版通过把输入的记号转换成小写然后参照一个屏蔽词列表文件进行检查来运行。如果单词出现在该文件中,则返回一个空的数组,导致该记号被丢弃。如果没有,那么该单词的小写形式会以规范化的语意(lexeme)的形式返回。另外,这个词典也可以配置成把非屏蔽词当做无法识别的东西返回,这样就允许将它们传递到列表中的下一个词典进行处理。

下面是一个使用 simple 模版定义的词典的例子:

CREATE TEXT SEARCH DICTIONARY public.simple_dict (
    TEMPLATE = pg_catalog.simple,
    STOPWORDS = english
);

这里,english 是屏蔽词文件的基础名。该文件的全称是 $SHAREDIR/tsearch_data/english.stop,这里的 $SHAREDIR 意思是 PostgreSQL 安装的共享数据目录,通常是 /usr/local/share/postgresql (如果你不知道,那么用 pg_config --sharedir 来判断)。这个文件的格式只是一列单词,一个词一行。空白行和结尾的空白会被忽略,大写会转换成小写,然后就没有其它对此文件内容的处理了。

现在我们可以测试我们的词典:

SELECT ts_lexize('public.simple_dict','YeS');
 ts_lexize
-----------
 {yes}

SELECT ts_lexize('public.simple_dict','The');
 ts_lexize
-----------
 {}

如果没有在屏蔽词文件中找到,我们也可以选择返回 NULL,而不是小写单词。这个行为是通过把该词典的 Accept 参数设置为 false 选中的。继续我们的例子:

ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false );

SELECT ts_lexize('public.simple_dict','YeS');
 ts_lexize
-----------


SELECT ts_lexize('public.simple_dict','The');
 ts_lexize
-----------
 {}

在缺省的设置 Accept = true 的时候,simple 词典只是放在词典列表的末尾的时候才有用,因为它不会给后面的词典传递任何记号。相对的是,如果 Accept = false,那么它就只是在后面至少还有一个词典的场合下才有用。

注意:大多数类型的词典依赖于配置文件,比如屏蔽词的文件。这些文件必须存储 UTF-8 编码。在把它们读取到服务器里的时候,如果编码不是UTF-8,那么它们会转换成实际的数据库编码。
注意:通常,一个数据库会话会在会话里第一次时候的时候,只读取配置文件一次。如果你修改了配置文件,并且希望强制现有的会话使用新的内容,可以在字典上发出一个 ALTER TEXT SEARCH DICTIONARY 命令。这样可以是一个“伪”更新,因为它实际上不修改任何参数值。
[编辑] 同义词典

这个词典模版用于创建一个用同义词替换某个单词的词典。不支持短语(这方面用知识词典第12.6.4节)。一个同义词词典可以用于克服语言学的问题,比如,为了避免英语词干词典把单词 'Paris' 修改成 'pari'。我们只要在同义词词典里面放一行 Paris paris,然后把这个词典放在 english_stem 词典之前就行了:

SELECT * FROM ts_debug('english', 'Paris');
   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes 
-----------+-----------------+-------+----------------+--------------+---------
 asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari}

CREATE TEXT SEARCH DICTIONARY my_synonym (
    TEMPLATE = synonym,
    SYNONYMS = my_synonyms
);

ALTER TEXT SEARCH CONFIGURATION english
    ALTER MAPPING FOR asciiword WITH my_synonym, english_stem;

SELECT * FROM ts_debug('english', 'Paris');
   alias   |   description   | token |       dictionaries        | dictionary | lexemes 
-----------+-----------------+-------+---------------------------+------------+---------
 asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}

同义词模版要求的唯一的参数是 SYNONYMS,它是其配置文件的基础名 — 在上面的例子里是 my_synonym。这个文件的全称会是 $SHAREDIR/tsearch_data/my_synonyms.syn (这里的 $SHAREDIR 是 PostgreSQL 安装的共享数据目录)。这个文件的格式是每个要被替换的单词一行,后面跟着它的同义词,用空格分隔。空白行和结尾的空白会被忽略,大写会转换成小写。

[编辑] 知识词典(Thesaurus Dictionary)

知识词典(有时候缩写成 TZ)是一个单词的集合,他包括单词和短语的关系,也就是:宽词(BT),窄词(NT),优选词,相关词等等。

基本上,一个知识词典用一个词替换了所有非优选的词,然后,还可以选择保存原来的词进行索引。PostgreSQL 的当前的知识词典的实现是一个同义词词典的扩展,添加了短语的支持。一个知识词典要求一个有下面格式的配置文件:

# this is a comment
sample word(s) : indexed word(s)
more sample word(s) : more indexed word(s)
...

这里的冒号(:)是短语和其替代品之间的分隔符。

知识词典使用一个子词典(通过该词典的配置声明)来在检查短语匹配之前规范化输入文本。我们只能选择一个子词典。如果子词典无法识别一个单词,那么就会报告一个错误。在这种情况下,你应该删除这个词或者告诉子词典这个词的信息。你可以在一个已索引的词前面放一个星号(*)以避免在它上面使用子字典,但是所有的 sample 单词都应该是子字典知道的。

如果有多个短语匹配输入,那么知识词典选取最长的匹配,然后绑定就断开,使用最后一个定义。

被子词典识别的特定的屏蔽词是不能声明的;我们需要用 ? (问好)标记屏蔽词可能出现的位置。比如,假设根据子字典, a 和 the 都是屏蔽词:

  ? one ? two : swsw

匹配 a one the two 和 the one a two;两个都被 swsw。

因为知识词典有能力识别短语,所以它必须记住自己的状态并且和分析器交互。一个知识词典使用这些赋值以检查它是应该处理下一个词,还是应该停止累积。知识词典的配置必须小心。比如,如果知识词典配置成只处理 asciiword 记号,那么像 one 7 这样的知识词典定义将不会工作,因为记号类型 uint 并没有赋予知识词典。

注意:知识词典在索引的过程中使用,因此如果修改了知识词典的参数,就要求重新索引。对于更多其它类型的词典,类似添加和删除屏蔽词啥的,就不需要重新索引。
[编辑] 知识词典配置

要定义一个知识词典,使用 thesaurus 模版。比如:

CREATE TEXT SEARCH DICTIONARY thesaurus_simple (
    TEMPLATE = thesaurus,
    DictFile = mythesaurus,
    Dictionary = pg_catalog.english_stem
);

这里:

  • thesaurus_simple 是新词典的名称
  • mythesaurus 是知识配置文件的基本名。(它的全称应该是 $SHAREDIR/tsearch_data/mythesaurus。这里的 $SHAREDIR 意思是安装的共享数据目录。)
  • pg_catalog.english_stem 是用于知识词典规范化的子词典(这里我们用了一个 Snowball 英语词干)。请注意这个子词典会有自己的配置(比如说,屏蔽词),我们没有在这里给出。

现在我们可以在一个配置里把知识词典 thesaurus_simple 和期望的记号类型绑定起来了,比如:

  ALTER TEXT SEARCH CONFIGURATION russian
      ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_simple;
[编辑] 知识词典例子

假设我们有个简单的天文学知识词典 thesaurus_astro,它包含一些天文学单词的组合:

supernovae stars : sn
crab nebulae : crab

下面我们创建了一个词典,并且把一些记号类型给天文知识词典和英文词干词典绑定:

CREATE TEXT SEARCH DICTIONARY thesaurus_astro (
    TEMPLATE = thesaurus,
    DictFile = thesaurus_astro,
    Dictionary = english_stem
);

ALTER TEXT SEARCH CONFIGURATION russian
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_astro, english_stem;

现在我们看看它是如何工作的。ts_lexize 现在在测试知识词典不是很有用,因为它把输入看做单个记号。我们可以用 plainto_tsquery 和 to_tsvector,它们会把输入分析成多个记号:

SELECT plainto_tsquery('supernova star');
 plainto_tsquery
-----------------
 'sn'

SELECT to_tsvector('supernova star');
 to_tsvector
-------------
 'sn':1

原则上,如果我们给参数加引号,那么哦我们可以使用 to_tsquery:

SELECT to_tsquery('''supernova star''');
 to_tsquery
------------
 'sn'

请注意 supernova star 在 thesaurus_astro 里匹配 supernovae stars 是因为我们在知识词典的定义里声明了 english_stem 词干。词干会删除 e 和 s。

要和替换同时索引原来的次,我们只要包含定义的右边就行了:

  supernovae stars : sn supernovae stars
SELECT plainto_tsquery('supernova star');
       plainto_tsquery
-----------------------------
 'sn' & 'supernova' & 'star'
[编辑] Ispell(拼写)词典

Ispell 词典模版支持形态学的词典,它可以把一个单词的许多不同的语言学形式转换成同一个语意(lexeme)。比如,英语的 Ispell 词典可以匹配搜索词 bank 的所有词尾变化和动词词性的变化,比如:banking,banked,banks,banks'和bank's。

标准的 PostgreSQL 发布并未包含任何 Ispell 配置文件。大量语言的词典可以从 Ispell 里找到。还有,还支持某些更现代的词典文件格式-- MySpell(OO<2.0.1)和 Hunspell(OO >= 2.0.2)。大量的词典可以在 OpenOffice Wiki 上找到。

要创建一个 Ispell 词典,使用内置的 ispell 模版并声明几个参数:

CREATE TEXT SEARCH DICTIONARY english_ispell (
    TEMPLATE = ispell,
    DictFile = english,
    AffFile = english,
    StopWords = english
);

这里,DictFile,AffFile 和 StopWords 声明词典,后缀和屏蔽词的基本命。屏蔽词文件格式和前面我们介绍过的简单字典类型的一样。其它文件的格式我们没有在这里描述,但是可以从上面提到的网站上获得。

Ispell 词典通常识别优先的单词集,这样它们后面就可以跟着更宽范围的词典;比如,一个 Snowball 词典,它可以识别一切的东西。

Ispell 词典支持分裂的组合词。这个特性很好,并且 PostgreSQL 也支持它。请注意后缀文件应该使用 compoundwords controlled 语句声明一个特殊标志,标记词典的词是可以有组合格式的:

  compoundwords  controlled z

下面是一些挪威语的例子:

SELECT ts_lexize('norwegian_ispell', 'overbuljongterningpakkmesterassistent');
   {over,buljong,terning,pakk,mester,assistent}
SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk');
   {sjokoladefabrikk,sjokolade,fabrikk}

注意: MySpell 不支持组合词。Hunspell 对组合词有非常复杂的支持。目前,PostgreSQL 只实现了 Hunspell 的基本组合词操作。
[编辑] Snowball 词典

Snowball 词典模版是基于 Martin Porter 的项目的,他是流行的 Porter 的英语词干算法的发明人。现在 Snowball 提供了许多语言的词干算法(参阅 Snowball 的站获取更多信息)。每个算法都知道如何把常见形式的单词归约成一个基本的,该语言内拼写的词,或者说词干。一个 Snowball 词典要求一个语言参数来表示使用哪个词干,以及一个可选的屏蔽词文件给出要删除的一个单词列表。(PostgreSQL 的标准屏蔽词列表在 Snowball 项目里也有提供。)比如,有一个等效于下面的内置的定义

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

屏蔽词文件格式和前面解释过的一样。

Snowball 词典识别一切东西,不管它是不是简化该单词,所以它应该放在词典列表的末尾。把它放在任何其它词典前头都是没啥用的,因为一个记号从不会穿过它到达别的词典。

 

 

 

 

<think>好的,我现在需要帮助用户理解他们提供的yum list available的输出中关于PostgreSQL的各个软件包。首先,用户可能是在查看他们系统上可用的PostgreSQL相关包,可能是想安装PostgreSQL或者相关的扩展、驱动等。 首先,我要确定用户的使用场景。用户执行的是yum list available并过滤了postgresql,说明他们可能在寻找可安装的PostgreSQL相关软件包。这可能是因为他们打算安装PostgreSQL服务器,或者需要某些特定的扩展、库文件等。用户可能对各个包的作用不太清楚,需要解释每个包的功能,以帮助他们决定安装哪些。 接下来,我需要解析每一个列出的包,并简要说明它们的作用。例如,postgresql.x86_64是主程序,postgresql-server.x86_64是服务端组件,而像postgresql-devel可能包含开发所需的头文件和库。需要确保每个包的解释准确,并且用用户容易理解的语言描述。 同时,用户可能对版本号、仓库来源(如ks10-adv-updates和ks10-adv-os)有疑问。需要解释版本号的结构,例如10.5-23.p04.ky10中的主版本是10.5,后面的可能是补丁或构建版本。仓库来源可能代表不同的更新通道,稳定版和测试版的区别。 还要考虑用户可能的后续操作,比如如何安装这些包,是否需要启用特定仓库,或者是否有依赖问题。例如,安装postgresql-server后需要初始化数据库,或者某些包如postgresql-contrib包含额外的扩展功能,用户是否需要这些功能。 另外,用户提供的列表中有一些与其他软件集成的包,比如freeradius-postgresql、libreoffice-postgresql,这些可能需要解释它们的作用,以便用户了解是否与他们的使用场景相关。 需要注意用户可能的错误理解,比如以为只需要安装postgresql就能运行服务器,但实际上还需要postgresql-server。或者在开发时需要安装devel包才能编译某些应用。 最后,总结建议用户根据需求安装核心包,并说明常用命令,如安装服务端和初始化步骤。同时提醒版本较旧,可能存在更新的版本,是否需要考虑升级或添加其他仓库。 总结来说,我需要将每个包的作用清晰列出,解释版本和仓库信息,并给出安装建议,帮助用户做出正确的选择。</think>以下是对该yum仓库中PostgreSQL相关软件包的详细说明及安装建议: **一、核心组件** 1. `postgresql.x86_64` (10.5-23.p04.ky10) PostgreSQL客户端程序和基础库,包含`psql`命令行工具,用于连接和管理数据库 2. `postgresql-server.x86_64` (10.5-23.p04.ky10) 数据库服务端主程序,需配合客户端使用。安装后需执行: ```bash sudo postgresql-setup initdb sudo systemctl start postgresql ``` 3. `postgresql-libs.x86_64` (10.5-23.p04.ky10) 客户端连接库文件,多数应用依赖此基础库 **二、扩展组件** 4. `postgresql-contrib.x86_64` 官方扩展模块集合,包含常用插件如`pg_stat_statements` 5. 过程语言支持: - `postgresql-plperl.x86_64` Perl扩展 - `postgresql-plpython3.x86_64` Python3扩展 - `postgresql-pltcl.x86_64` Tcl扩展 **三、开发相关** 6. `postgresql-devel.x86_64` 开发头文件和静态库,用于编译PostgreSQL扩展 7. `postgresql-static.x86_64` 静态链接库版本 **、驱动集成** 8. `postgresql-jdbc.noarch` (42.4.1) JDBC 4.2驱动,支持Java应用连接,对应JDK 1.8+ 9. `qt5-qtbase-postgresql.x86_64` Qt5框架的PostgreSQL数据库驱动 **五、服务集成** 10. `freeradius-postgresql.x86_64` RADIUS认证服务的PostgreSQL支持模块 11. `proftpd-postgresql.x86_64` ProFTPD的PostgreSQL认证模块 **版本说明**: 当前仓库提供的是PostgreSQL 10.5(2018年发布),版本较旧。建议检查是否需通过其他仓库获取新版本(如PostgreSQL官方仓库通常提供最新版) **安装建议**: ```bash # 基础服务端安装 sudo yum install postgresql-server postgresql-contrib # 开发环境安装 sudo yum install postgresql-devel # Java项目需安装JDBC驱动 sudo yum install postgresql-jdbc ``` **注意事项**: 1. 安装服务端后必须初始化数据库: ```bash sudo postgresql-setup initdb sudo systemctl enable postgresql ``` 2. 默认数据目录位于`/var/lib/pgsql` 3. 配置文件路径:`/var/lib/pgsql/data/postgresql.conf`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值