在地图或地理信息有关的场景里 ,地址关键词的检索尤其重要。比如打开百度地图,想要查询某个位置的信息“北京市海淀区清华东路17号中国农业大学”,往往我们输入的是关键词“中国农业大学”而不是精确到街道的详细地址信息。在地址关键词检索的背后,需要的是一款可以支持全文检索和模糊查询的数据库与之匹配,以此快速提高地址检索的效率。
PostgreSQL被誉为“世界上可获得的最先进的开源数据库 ”,拥有很强的文本搜索能力,不仅支持全文检索,PostgreSQL还支持模糊查询、正则查询。除此之外,PostgreSQL还内置了表达式索引、Gin索引功能,配合丰富的插件生态,在地址关键词检索方向有比较大的优势。
jieba结巴分词是一个强大的分词库,分词更加贴合业务属性特点,主要功能包含:支持不同模式的分词、自定义字典、关键字提取、词性标注。pg_jieba运用了jieba分词算法,构建了PostgreSQL中文分词插件,分词效果也有不错的表现。
#预先安装好cmake编译工具,此处不再赘述
g++ (version >= 4.1 is recommended) or clang++;
cmake (version >= 2.6 is recommended);
#安装PG相关依赖
sudo yum install postgresql postgresql-server postgresql-devel
#git下载pg_jieba,无Git命令可单独下载解压安装
git clone https://github.com/jaiminpan/pg_jieba
cd pg_jieba
mkdir build
cd build
cmake -D PostgreSQL_TYPE_INCLUDE_DIR=/opt/highgo/hgdb-see-4.5.8/include/postgresql/server ..
make && make install
#登录数据库创建pg_jieba扩展:
create extension pg_jieba;
EXAMPLE:
highgo=# create extension pg_jieba;
highgo=# select * from to_tsquery('jiebacfg', '是拖拉机学院手扶拖拉机专业的。'); to_tsquery
'拖拉机' & '学院' & '手扶拖拉机' & '专业' (1 row)
highgo=# select * from to_tsvector('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。'); to_tsvector
'ceo':18 '不用':8 '专业':5 '人生':21 '会':13 '加薪':15 '升职':14 '多久':9 '学院':3 '巅峰':22 '当上':17 '手扶拖拉机':4 '拖拉机':2 '走上':20 (1 row)
highgo=# select * from ts_token_type('jieba');
tokid | alias | description
-------+-------+-----------------------------
1 | eng | letter
2 | nz | other proper noun
3 | n | noun
... ...
... ...
55 | ug | ug
56 | rz | rz
57 | |
(56 rows)
highgo=# select * from ts_debug('jiebacfg', '是拖拉机学院手扶拖拉机专业的。');
alias | description | token | dictionaries | dictionary | lexemes
-------+---------------+------------+--------------+------------+--------------
v | verb | 是 | {jieba_stem} | jieba_stem | {}
n | noun | 拖拉机 | {jieba_stem} | jieba_stem | {拖拉机}
n | noun | 学院 | {jieba_stem} | jieba_stem | {学院}
n | noun | 手扶拖拉机 | {jieba_stem} | jieba_stem | {手扶拖拉机}
n | noun | 专业 | {jieba_stem} | jieba_stem | {专业}
uj | uj | 的 | {jieba_stem} | jieba_stem | {}
x | unknown | 。 | {jieba_stem} | jieba_stem | {}
PS:当通过shared_preload_libraries加载pg_jieba时,以下配置选项可用,可以添加到postgresql.conf中
pg_jieba.hmm_model(需要重新启动)hmm模型文件。
pg_jieba.base_dict(需要重新启动)基本字典。
pg_jieba.user_dict(需要重新启动)特定用户词典名称的csv列表(不包括后缀.dict)。所有这些都应位于目录tsearch_data中。