文本搜索字典
Apache Cloudberry 的全文搜索解析器生成的词元(token)会依次传递给一系列字典,用于生成标准化的术语,即“词素”(lexeme)。可使用不同类型的字典,以适应不同语言并按需对词元进行过滤和转换。
本节包含以下子主题:
关于文本搜索字典
字典的作用是过滤掉不应参与搜索的词(即停用词),并将词语标准化,使相同词的不同派生形式能匹配在一起。标准化后的词称为词素(lexeme)。除了提升搜索质量,词的标准化和停用词移除还能减少 tsvector
表示文档时的大小,从而提高性能。标准化未必具备语言学含义,更多取决于应用语义。
一些标准化示例:
- 语言层面:Ispell 字典尝试将输入词还原为标准形式;词干提取(stemmer)字典会去除词尾;
- URL 标准化:可将等价的链接转换为统一形式,例如:
http://www.pgsql.ru/db/mw/index.html
http://www.pgsql.ru/db/mw/
http://www.pgsql.ru/db/../db/mw/index.html
- 颜色名称可转换为十六进制值,如:
red
,green
,blue
,magenta
→FF0000
,00FF00
,0000FF
,FF00FF
- 如果索引的是数字,可去除小数部分以减少取值范围,例如:
3.14159265359
、3.1415926
和3.14
在只保留两位小数时都会标准化为相同值。
一个字典程序接收词元作为输入,返回以下几种结果之一:
- 如果该词元在字典中已知,返回一个词素数组(注意:一个词元可能产生多个词素);
- 返回一个带有
TSL_FILTER
标志的单个词素,表示将词元替换为一个新的词元,并传递给后续字典(此类字典称为 过滤字典); - 如果该词元是已知的停用词,返回空数组;
- 如果字典无法识别该词元,返回
NULL
。
Apache Cloudberry 为多种语言预定义了字典模板,并允许基于模板创建自定义字典。如果现有模板不适用,也可以创建新的模板,详见 Apache Cloudberry 源码包的 contrib/
目录中的示例。
文本搜索配置将解析器与字典集合组合起来,用于处理解析器返回的不同类型的词元。配置为解析器的每一种词元类型指定一个字典列表。当解析器识别到某个词元时,会按配置顺序依次查询字典:
- 一旦某个字典识别出该词元(即返回非 NULL ),就停止继续;
- 如果识别结果是停用词,或所有字典都未能识别该词元,该词元将被丢弃,不再索引或参与搜索;
- 如果某个字典是过滤字典,并返回了一个新词元,则这个新词元会继续传递给后续字典处理。
配置字典列表时的一般规则是:先放最专用、最严格的字典,再放通用字典,最后放最宽松的字典,如 Snowball stemmer 或 simple
字典(它能识别所有词元)。例如,针对天文学搜索(配置名为 astro_en
),可以为 asciiword
类型设置如下字典链:
ALTER TEXT SEARCH CONFIGURATION astro_en
ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem;