0

比如 SegmentFault 每一个问题(问题 回答 标签)有多张表,怎么利用lucene等实现全文检索,对全文检索的应用没接触过,希望能详解。

2011-10-07 提问
4 个回答
0

楼主只是想要支持全文检索的话,我是这样考虑的.
如果你你还想使用数据库同时兼顾全文检索,你可以考虑使用pg,这个数据库是支持全文检索的;
如果你使用lucene的话,lucene里面一个document就是对于oss里面的一条记录,一个field就是oss里面一个字段..像sf这种估计要这样吧..
field1 id not-analyzer
field2 question chinese-analyzer
field3 answer1+answer2+.. chinese-analyzer
field4 tag 使用空格分词

每新建一个问题就新增一个doc..用户更新问题或添加答案..就会更新倒排索引..

我这个只是简单猜测...我不是sf的开发者哈..

0

如果是简单的索引的话,不需要做统计这些。
那么你完全可以自己写一个翻译器,对不同的表翻译成最终你需要的内容。

好比你做一个翻译模版,需要id,name,content,type
然后你其他表去填充这个模版即可。

0

根据业务做一个“视图” 考虑哪些需要检索、哪些需要展示(列表、详情)、哪些需要做导航(facet)等等~~~

0

对于没有入门的,想快速使用Lucene,这么理解吧:

1.首先你要弄清楚Lucene搜索的方式与数据的异同;
数据库的搜索是对表和的记录的各项field进行like查询,返回记录,得到查询的结果集。
Lucene是全文检索是对索引中Document的各field进行匹配,可返回document,得到查询的结果集。

2.创建索引;
明白第一步,就要把数据库表字段的信息转换成Document,实际就是创建索引。
最简单的实现,你把数据库一个问题及回答、标签数据必要的字段放进一个Document对象里面。

//伪代码
Document doc = new Document();
doc.add(new Field("问题ID", 值));
doc.add(new Field("问题标题", 值));
doc.add(new Field("问题内容", 值));
doc.add(new Field("回答id_1", 回答1内容));
doc.add(new Field("回答id_2", 回答2内容));
doc.add(new Field("回答id_3", 回答3内容));
//写索引
new IndexWriter().addDocument(document);

3.搜索索引,那用户输入,对Document的Field进行搜索就可以了,返回分页结果集;

4.页面显示,每条结果项里面有对应的问题ID,可以用ID去数据库查询其它相关的信息,显示出来。

大概过程是这样,实际操作贴下我的笔记吧,大概有几篇甚至带源码,入门上手完全没问题。
Lucene第六篇:Lucene索引操作
Lucene第七篇:在你的项目中集成全文检索

撰写答案

推广链接