解析文档
GaussDB中提供了to_tsvector函数把文档处理成tsvector数据类型。
1 | to_tsvector([ config regconfig, ] document text) returns tsvector |
to_tsvector将文本文档解析为token,再将token简化到词素,并返回一个tsvector。在tsvector中包含了各词素及词素在文档中的位置。文档根据默认的或指定的文本搜索分词器进行处理。这里有一个简单的例子:
1 2 3 4 | gaussdb=# SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats'); to_tsvector ----------------------------------------------------- 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4 |
通过以上例子可发现,在tsvector的结果中不包含词a、on或者it,且rats变成了rat,并忽略了标点符号“-”。
to_tsvector函数内部调用了一个解析器,将文档的文本分解成token并给每个token指定一个类型。对于每个token,有一系列词典可供查询。词典系列因token类型的不同而不同。识别token的第一本词典将产生一个或多个标准词素来表示token。例如:
- rats变成rat因为词典认为词rats是rat的复数形式。
- 有些词被作为停用词(请参见停用词),这样它们就会被忽略,因为它们出现得太过频繁以致于在搜索中没有用处。比如例子中的a、on和it。
- 如果没有词典识别token,那么它也被忽略。在这个例子中,符号“-”被忽略,因为词典没有给它分配token类型(空间符号),即空间符号永远不会被索引。
语法解析器、词典和要索引的token类型由选定的文本搜索配置决定。可以在同一个数据库中有多种不同的配置,并且有用于多种语言的预定义配置。在以上例子中,使用的是英语的默认english。
setweight函数可以给tsvector的记录赋予权重,权重值是字母A、B、C、D之一,用于标记来自文档不同部分的记录,比如标题、正文。之后,便可以根据文档各部分的权重值对搜索结果排序。
因为to_tsvector(NULL)会返回空,当字段可能是空的时候,建议使用coalesce。以下是推荐的为结构化文档创建tsvector的方法:
1 2 3 4 5 6 7 8 9 10 | gaussdb=# CREATE TABLE tsearch.tt (id int, title text, keyword text, abstract text, body text, ti tsvector); gaussdb=# INSERT INTO tsearch.tt(id, title, keyword, abstract, body) VALUES (1, 'America', 'New York', 'America','America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley.'); gaussdb=# UPDATE tsearch.tt SET ti = setweight(to_tsvector(coalesce(title,'')), 'A') || setweight(to_tsvector(coalesce(keyword,'')), 'B') || setweight(to_tsvector(coalesce(abstract,'')), 'C') || setweight(to_tsvector(coalesce(body,'')), 'D'); gaussdb=# DROP TABLE tsearch.tt; |
上例使用setweight标记已完成的tsvector中的每个词的来源,并且使用tsvector连接操作符||合并标记过的tsvector值,处理tsvector一节详细介绍了这些操作。