对于数据库里的多张表怎么利用lucene等实现全文检索

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

阅读 7.7k
评论
    4 个回答

    楼主只是想要支持全文检索的话,我是这样考虑的.
    如果你你还想使用数据库同时兼顾全文检索,你可以考虑使用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的开发者哈..

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

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

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

          对于没有入门的,想快速使用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第七篇:在你的项目中集成全文检索

            撰写回答

            登录后参与交流、获取后续更新提醒