# 解析文档
DWS中提供了to_tsvector函数把文档处理成tsvector数据类型。
```
to_tsvector([ config regconfig, ] document text) returns tsvector
```
to_tsvector将文本文档解析为token，再将token简化到词素，并返回一个tsvector。其中tsvector中列出了词素及它们在文档中的位置。文档是根据指定的或默认的文本搜索分词器进行处理的。这里有一个简单的例子：
```
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的复数形式。
- 有些词被作为停用词（请参考[停用词](https://support.huaweicloud.com/sqlreference-dws/dws_06_0104.html)），这样它们就会被忽略，因为它们出现得太过频繁以致于搜索中没有用处。比如例子中的a、on和it。
- 如果没有词典识别token，那么它也被忽略。在这个例子中，符号"-"被忽略，因为词典没有给它分配token类型（空间符号），即空间符号永远不会被索引。
语法解析器、词典和要索引的token类型由选定的文本搜索分词器决定。可以在同一个数据库中有多种不同的分词器，以及提供各种语言的预定义分词器。在以上例子中，使用缺省分词器english。
函数setweight可以给tsvector的记录加权重，权重是字母A、B、C、D之一。这通常用于标记来自文档不同部分的记录，比如标题、正文。之后，这些信息可以用于排序搜索结果。
因为to_tsvector(NULL)会返回空，当字段可能是空的时候，建议使用coalesce。以下是推荐的为结构化文档创建tsvector的方法：
```
CREATE TABLE tsearch.tt (id int, title text, keyword text, abstract text, body text, ti tsvector);
INSERT INTO tsearch.tt(id, title, keyword, abstract, body) VALUES (1, 'book', 'literature', 'Ancient poetry','Tang poem Song jambic verse');
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');
DROP TABLE tsearch.tt;
```
上例使用setweight标记已完成的tsvector中的每个词的来源，并且使用tsvector连接操作符\|\|合并标记过的tsvector值，[处理tsvector](https://support.huaweicloud.com/sqlreference-dws/dws_06_0097.html)一节详细介绍了这些操作。
