前言
vertica当我们需要查询的列字段过长时候(例如long varchar(1048576)),会导致查询速度过慢,所以这个时候我们可以建立全文索引,将字段长度缩小(varchar(128)) ,提高查询速度
假设需求
假设有一个名为 test 的表,包含以下列
id:文章的唯一标识符
title:文章的标题
content:文章的内容
现在需要创建一个全文索引,以便可以快速搜索文章标题的关键词。
步骤如下:
1.创建中文分词器
2.创建主键
3.创建投影
4.创建全文索引
5.查询
1.创建中文分词器
CREATE OR REPLACE TRANSFORM FUNCTION v_txtindex.ICUchineseTonkenizer AS LANGUAGE ‘C++’ NAME ‘my_tokenizer_factory’ LIBRARY v_txtindex.logSearchLib not FENCED;
对常量分词
select v_txtindex.ICUChineseTokenizer(123,‘重庆成都上海’) OVER();
2.更新表的主键
//选择一个主键 (必须)
//不然在创建投影和索引的时候会报错
Alter TABLE tableName ADD PRIMARY KEY(ID);
3.创建投影
创建投影
CREATE PROJECTION IF NOT EXISTS test_projection_title
(
id,//id 必须放在第一位
title,// 对那个字段创建全文索引,第二位就必须是那个字段(这里对title建立全文索引所有这里是title字段,如果是对content建立索引,则这里应该改为content)
content
)
AS
SELECT id, title, content
FROM articles
ORDER BY id
SEGMENTED BY HASH(id) ALL NODES kasfe;
删除投影
DROP PROJECTION test_projection_title RESTRICT
4.创建全文索引
创建全文索引
//这里的(id,title,content) 三个参数
//id代表之前第二步骤创建的主键
//title代表建立的索引字段
//content代表额外字段,可以自行添加,方便不用回表操作
CREATE TEXT INDEX test_index ON test(id,title,content)
TOKENIZER v_txtindex.ICUChineseTokenizer(long varchar) stemmer none;
删除索引
DROP TEXT INDEX test_index;
5.查询
//通过分词查找到索引表的id
//对单个词语进行查询
select doc_id from test_index where token="重庆";
//对多个词语进行查询
//先进行分词
select v_txtindex.ICUChineseTokenizer(123,'重庆成都上海') OVER();
//查询
select a1.doc_id from
test.Index a1,
test.Index a2,
test.Index a3
where 1=1 and a1.doc_id=a2.doc_id
and a2.doc_id=a3.doc_id
and a1.token="重庆"
and a2.token="成都"
and a3.token="上海"
//通过查询出来的doc_id 就可以查出需要的数据