全文检索技术是智能信息管理的关键技术之一,其主要目的就是实现对大容量的非结构化数据的快速查找。DM 实现了全文检索功能,并将其作为 DM 服务器的一个较独立的组件,提供更加准确的全文检索功能,较好地解决了模糊查询方式带来的问题。
全文索引为在字符串数据中进行复杂的词搜索提供了有效支持,用户可以在指定表的文本列上创建和删除全文索引。创建全文索引后全文索引未插入任何索引信息。当用户填充全文索引时,系统才将定义了全文索引的文本列的内容进行分词,并根据分词结果填充索引。用户可以在进行全文索引填充的列上使用 CONTAINS 谓词进行全文检索。
在创建全文索引成功后,假设索引名为 INDEX_NAME,则系统会自动产生如下相关的辅助表(后面简称 I表,P表,N表,D表):CTI$INDEX_NAME$I,CTI$INDEX_NAME$P, CTI$INDEX_NAME$N和 CTI$INDEX_NAME$D,I 表主键为(WORD、FIRSTID、WID),用于保存分词结果,记录词的基本信息,通过该信息就可以快速地定位到该词的基表记录;P 表主键为(PND_DOCID),用于保存基表发生的增量数据变化,用于修改全文索引时的增量填充。N表主键为(N_DOCID),用于保存原表记录rowid和新词条记录的docid的映射关系,N_DOCID 是 unique 的;D 表主键为(DOCID),保存了所有将被删除的 docid,被删除的 docid 即将不能通过全文索引查询到。另外,如果原表有自定义聚集主键,那么P 表和 N 表会将该自定义聚集主键列“复制”到各自表中。
DM 全文索引创建的过程中,用户可以为分词器定义分词参数,即控制分词器分词的数量,包括 5 种分词参数:
- CHINESE_LEXER,中文最少分词;
- CHINESE_VGRAM_LEXER,机械双字分词;
- CHINESE_FP_LEXER,中文最多分词;
- ENGLISH_LEXER,英文分词;
- DEFAULT_LEXER,默认分词,为中文最少分词。
指定中文分词参数可以切分英文,但是指定英文分词参数不可以切分中文,所以使用英文分词算法对中文文本进行分词时,分词结果将为空。
经过全文的创建和更新后,可以进行全文检索,全文检索支持的检索方式有: - 在 CONTAINS 谓词内支持 AND、OR 和 AND NOT 的短语查询组合条件,例如查询address 表中地址在洪山区太阳城的记录:SELECT * FROM person.address WHERE CONTAINS(address1, ‘洪山区’ AND ‘太阳城’);
- 全文检索支持单词或者句子的检索, 例如查询 address 表中地址在江汉区发展大道的记录:SELECT * FROM person.address WHERE CONTAINS(address1, ‘江汉区发展大道’);
- 不支持模糊方式的全文检索,例如查询“江汉区*”。
- 检索条件子句可以和其他子句共同组成 WHERE 的检索条件,例如查询 address表中地址在武汉市洪山区的记录。
SELECT * FROM person.address WHERE CONTAINS(address1, ‘洪山区’) AND city LIKE ‘%武汉市%’;
如上图所示,DM 全文检索时对查询的文本做了预处理,首先根据词文本进行最少分词,并依据词频信息找出查询关键字,然后对这些关键字进行优先级排序,这样可以在第一次检索时找出所需文本的最小结果集,然后在该结果集的基础上再进行依次筛选,最终获得查询文本,这样能较大地提高查询性能。