说起JAVA的全文检索,最常被提起的应该就是
lucene了
但是吧,数据量一大了,建索引额外耗费系统资源。CT目前是建索引的batch和web系统分离的,全站多线程建索引耗费时间在2小时左右。
而且lucene本身自带的StandardAnalyzer对于中文的分词相当弱智(有专门的中文分词器,稍后日志里面会介绍)。
不想花那么多心思在上面怎么办?怎摸办? 其实lucene姑娘并不是唯一的选择。大多数的RDBMS都是自带有全文检索功能的。
不例外,MYSQL里也有原生态的全文检索支持。而且性能还相当不错,对于百万级别以下的系统是绰绰有余的。
最经常被使用的innoDB是不支持全文检索的,我们需要MyISAM引擎
但是,数据库已经是innoDB了怎摸办? 有个办法是另建一张搜索表。
比如,原先的表是 bbs_topics,可以针对需要建立索引的列,另建一张全文索引表:
对于不是很庞大的数据量,结合庖丁的中文分词,效果还是可以的:
相关搜索:
然后还有一个什么问题捏?主表有插入/更新之后,搜索表的数据怎么办?用 触发器可以同步两张表的数据,具体就不多八卦鸟。
发布时间:2008-11-07 23:31:43 | 阅读:349 | 评论:0
但是吧,数据量一大了,建索引额外耗费系统资源。CT目前是建索引的batch和web系统分离的,全站多线程建索引耗费时间在2小时左右。
而且lucene本身自带的StandardAnalyzer对于中文的分词相当弱智(有专门的中文分词器,稍后日志里面会介绍)。
不想花那么多心思在上面怎么办?怎摸办? 其实lucene姑娘并不是唯一的选择。大多数的RDBMS都是自带有全文检索功能的。
不例外,MYSQL里也有原生态的全文检索支持。而且性能还相当不错,对于百万级别以下的系统是绰绰有余的。
最经常被使用的innoDB是不支持全文检索的,我们需要MyISAM引擎
但是,数据库已经是innoDB了怎摸办? 有个办法是另建一张搜索表。
比如,原先的表是 bbs_topics,可以针对需要建立索引的列,另建一张全文索引表:
CREATE TABLE search_bbs_topics ( `id` INTEGER UNSIGNED NOT NULL, `title` TEXT NOT NULL, `author` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = MyISAM; ALTER TABLE search_bbs_topics ADD FULLTEXT INDEX fullTextTitle(`title`); 然后INSERT INTO把相应的数据插入表中。 这样,就可以通过 match(列名) against('*匹配数据*' in boolean mode) 的语法来全文检索了。
对于不是很庞大的数据量,结合庖丁的中文分词,效果还是可以的:
相关搜索:
然后还有一个什么问题捏?主表有插入/更新之后,搜索表的数据怎么办?用 触发器可以同步两张表的数据,具体就不多八卦鸟。
发布时间:2008-11-07 23:31:43 | 阅读:349 | 评论:0