Postgresql全文索引-中文

宏哥 发布于 2011/04/23 19:05
阅读 6K+
收藏 18

看看下面三个图片

300万产品数据

进行搜索,总查询20多秒,在笔记本的VPS上

然后进行“电脑”进行搜索

然后进行品牌过滤

 

请注意查询时间,

PG全文索引速度是非常快的

加载中
1
宏哥
宏哥

lucene应该有一定的速度优势,目前还没有测试过,不做评价

GIN索引是超级强悍的,速度倒不是最强悍的

关键是它能组合数据库其他的表,字段,甚至进行关联查询

这个是lucene无法做到的,叫做搜索业务有关性,lucene集中在二维表格的属性过滤

Lucene,Sphinx都是全文搜索,它们共同的弱点就是无法进行结构化查询

用数据库,可以通过业务规则,迅速缩小搜索范围

这个特点,bbs或者社区不一定需要

在一个子集进行搜索,速度极其快,而且数据更新马上生效

备份,管理都极其简单

但是建立索引速度很慢,以大量的计算作为基础的

1
宏哥
宏哥

引用来自“一千年前的人”的答案

进行搜索,总查询20多秒,在笔记本的VPS上 给Linux 虚拟机512M

把上面这个 keyword 放入OSC的搜索框, 搜出来的结果就很糟糕了。

搜索难度不在于匹配, 在于根据业务分解,排序

Lucene 只能实现匹配, 算不上"搜索", 匹配100万记录和不匹配任何记录, 效果等同

全文搜索很容易集成 权限,组织, 业务规则, 就是结果集的集合运算

baidu 这种比较复杂, 很多维度来决定搜索结果, 还要集成竞价

你注意我贴图当中的右下角执行时间, 长句肯定是先分词,再做并/或 运算, 越长执行时间越短

搞开源的那些人, 知道的, 懂什么技术,都是扯淡

0
宏哥
宏哥

或操作

中英文混合

0
宏哥
宏哥

这个的实现,需要在填充Name_idx这个数据的时候

已经做好分词

测试是在我自己的笔记本电脑上完成的,D630

笔记本总共3G的内存,给Linux 虚拟机512M,跑PHP,Postgres

Ubuntu 8.4.4LTS,Postgresql 8.3.12

Virtualbox 2.0.12

上面的速度都是跑出来的

340万的数据,对512M的linux+postgres非常轻松

但是建立索引的时候,花了2个小时

不需要什么特别的优化

0
宏哥
宏哥

排序翻第二页

0
宏哥
宏哥

这个解决方案已经可以对付大多数站内搜索的需要

前提是,你得用Postgres

其他方面都没有什么要求

比那个Like速度可以快上100倍

并且可以针对任何字段进行过滤,排序,速度都是奇快无比

如果懒的话,连搜索缓存都不需要做,因为速度太快了

很少站点敢于提供站内搜索

原因就是速度太慢了

0
cnblogs
cnblogs

多谢楼主分享。有两个疑问不知道楼主能否解答一下:

看到里面提到的是对产品名进行索引,不知道有没有试过对一些大文本的内容,例如产品详细介绍内容进行全文搜索时性能如何?

另外这个跟使用lucene进行检索,二者性能能差多少?

0
绿悠悠
绿悠悠

引用来自#6楼“cnblogs”的帖子

多谢楼主分享。有两个疑问不知道楼主能否解答一下:

看到里面提到的是对产品名进行索引,不知道有没有试过对一些大文本的内容,例如产品详细介绍内容进行全文搜索时性能如何?

另外这个跟使用lucene进行检索,二者性能能差多少?

我也想知道同样的问题,据红薯说oschina用的是lucene做全文检索的。

0
宏哥
宏哥

引用来自#6楼“cnblogs”的帖子

多谢楼主分享。有两个疑问不知道楼主能否解答一下:

看到里面提到的是对产品名进行索引,不知道有没有试过对一些大文本的内容,例如产品详细介绍内容进行全文搜索时性能如何?

另外这个跟使用lucene进行检索,二者性能能差多少?

这种索引,是基于词汇表

文本大小主要影响index的大小

和速度没有什么 关系

直白说,性能不受到文本大小影响或者说影响很小

index的大小会增加很多,和词汇出现的数量基本上成正比

 

我这个数据也不小了,总共340多万的数据,最早是从mysql 导出到文本再写脚本导入PG

那个文本,都超过G了

0
cnblogs
cnblogs

引用来自#8楼“宏哥”的帖子

lucene应该有一定的速度优势,目前还没有测试过,不做评价

GIN索引是超级强悍的,速度倒不是最强悍的

关键是它能组合数据库其他的表,字段,甚至进行关联查询

这个是lucene无法做到的,叫做搜索业务有关性,lucene集中在二维表格的属性过滤

Lucene,Sphinx都是全文搜索,它们共同的弱点就是无法进行结构化查询

用数据库,可以通过业务规则,迅速缩小搜索范围

这个特点,bbs或者社区不一定需要

在一个子集进行搜索,速度极其快,而且数据更新马上生效

备份,管理都极其简单

但是建立索引速度很慢,以大量的计算作为基础的

PostgreSQL 对中文分词是如何处理的呢?

返回顶部
顶部