Rails 使用 PostgreSQL + pg_search 进行中文全文检索

samport · 2016年06月03日 · 最后由 themadeknight 回复于 2016年09月13日 · 7014 次阅读

在小型 Rails 项目中不借助 Elasticsearch 等专业的第三方搜索引擎,只使用 pg_search 进行全文检索其实是能够满足一般应用场景的。

但是由于 postgresql 默认不支持中文分词的功能,所以需要额外为数据库配置一个中文分词的扩展。一个比较简单的中文分词的方案是采用 scws+ 中文字典库+zhparser 组合。另外,在 pg_search 调用时,需要指定在数据库设置的中文检索配置。除此以外就没有什么特别之处了。

详细的安装过程请参照: PostgreSQL + SCWS + zhparser + Rails4 + pg_search 实现中文全文检索

在线演示:Full-text Searching Demo [Chinese/English/Japanese]

注:不管是 Rails 还是 Github,我都是初学者,难免有错误,欢迎大家指正。例如我还是搞不定那个 application_helper 里面的 link_activate 方法。如果项目不是放在子目录的话,就没问题,现在布置到子目录里面,菜单链接就没法显示 active 了。

效果不佳,搜索“三十”找不打,但下文有包含。 如图

之前我的网站 http://www.rails365.net 也是使用 postgresql 本身的全文检索,也安装了中文支持的插件。

这里我也写过一篇文章来介绍它的使用 http://www.rails365.net/articles/postgresql-quan-wen-jian-suo-xi-tong-pg-search-shi-xian-xian-si

不过我以 PostgreSQL 的全文检索的使用者来看,它的速度并不快,创建一篇文章,要建立好多索引,这个时候后台就在慢慢创建,要等待一些时间,它查询起来,也是时快时慢的,慢的时候要等上几秒,所以还不如使用 elasticsearch 来搜索,我的网站最后换上了它,不仅功能强大了许多,而且速度更快,毕竟它是号称接近实时的。

所以建议不使用它。当然得看你的应用场景和数据量。

这种方式本身对小系统来说应该够用了。确实我也发现有些分词查询效果不太好。是 scws 的算法问题还是词典问题我也不清楚。

另外,我发现日文的 mecab 引擎的分词性能和效果都很好,页面上输入一些日文测试后完全达到使用实用水平。当然性能上需要进一步的测试。

国内也有人拿 mecab 引擎做中文分词的,但是不知道中文词典做的怎么样。

其实现在机器处理数据能力很强,小系统可以不分词,只拆字,然后自己调整匹配度就行了

在实现过程中,我新建了 3 个文本搜索配置,但是只能用 1 个,而且删除之后,还可以用,楼主有遇到吗? 查看所有的文本搜索配置: \dF 我感觉只要是出现的配置,那就应该是可用的。 但实际好像不是这样的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号