现在要对大量文件进行全文检索,测试表结构如下:
 ID TITILE  FILEPATH
  1  test   g:/file/test1.txt
  2  test   g:/file/test2.txt
 filepath存储的是需要检索的文件路径
 问题:假设我们现在输入一个关键字为条件,这个关键字可能在test1.txt,test2.txt中出现
在查询后返回符合条件的数据库记录有做过类似项目 或者实验的 麻烦说下思路,谢谢大家
现在主要是不知道如何将索引和数据库记录进行对应。

解决方案 »

  1.   

    首先 lucene  不是数据库,所以不能把他与 数据库等价。但他的数据组织也可看作是数据库中表的一行吧。
    那么你搜索到结果时,他返回的应该是 相关的 document。然这个 document 则可心看作是一组相关的数据整体,可以把他比作表中的一行。如果里面有 对应 数据库的中 id 信息,那么通过 lucene 中得到的 id,再从数据库中查找相应的数据就行了。
      

  2.   

    首先 谢谢楼上几位的支持和发言
    2楼说的很对 我都考虑到了 我准备在上传文件的时候以数据库对应记录ID的某种格式定义为文件名,这样就不存在把ID还要写入文件以及在读取的问题。 
    问题是假如和这个关键字匹配的记录有1万个,这些ID存放在哪里?内存?不太现实,而且先不考虑多用户并发的性能 假设单用户1万个ID分页也是头疼的事情
    我看了hibernate search 和compass 的简单例子
    他们都是对一个数据字段进行索引 所以可以直接返回实体对象 现在的问题还是文件和记录的关联 
      

  3.   

    简单,你说的是在数据的时候,同时在数据库和索引库中都会有记录吧,那你再写一个LuceneDao,在Service中重写增删改查,里面放LuceneDao和DomainDao中相应的方法,然后在Action中每次操作的时候,调用响应的Service方法就OK了
      

  4.   

    谢谢留言
    项目是C++开发组将数据和文件分别入库和上传服务器,索引的建立JAVA这边打算是用定时器或者别的触发机制,现在的问题是数据库记录的实体对象和全文检索返回的数据不能对应,现在暂时能想到的是检索出匹配的文件然后根据文件名(文件名和数据库记录主键ID相关联),再通过数据ID去查询数据库,问题就是数据量很大时返回的ID数量很多,分页就比较麻烦了
      

  5.   

    1.你可以先通过数据库查询出结果在lucene建立索引
    2.通过查询索引得出结果
      

  6.   

    你可以先把数据库里的数据读取出来,再用lucene把一些关键的信息做成索引文件,每次查询先从lucene里查,lucene返回的是部分信息,如果符合用户要求再到数据库里把该信息的全部内容取出来。这样可以解决数据库查询慢的问题。
      

  7.   

    暂时只能这么做实验 问题是真实环境数据量非常大 
    假如和这个关键字匹配的记录有1万个,这些ID存放在哪里?而且先不考虑多用户并发的性能 假设单用户1万个ID分页也是头疼的事情
    我看了hibernate search 和compass 的简单例子
    他们都是对一个数据字段进行索引 所以可以直接返回实体对象 现在的问题还是文件和记录的关联 
      

  8.   

    我也刚刚在搞lucene
      无法说清楚这个问题。
    学习一下
      

  9.   

    lucene 每个版本的构造方法都不一样 实在而且中文分词只能单字分词 
    现在用IKAnalyzer 分词 很不错 
    现在还是对分页没有太好的想法
      

  10.   

    你显示的东西一定要全部显示吗?一般都是先显示部分,要再详细的话再把全部的内容取出,如果一上来就显示全部那真的浪费资源,比如说查找一个人,根据姓可能有上万条记录,但是你不会在查找结果上显示身高、体重等一些无关的数据吧,都是地址、头像、一些常常使用的查询条件。再来就是增加查询条件缩小查询范围。如果只有一个条件那只好显示部分数据。还有lucene提供分页,每次只返回一些结果,这样不会有大批量的数据返回。应该不会有数据量大的问题。
      

  11.   

    谢谢楼上 发言
    现在的问题纠结在 Lucene全文检索不是直接检索的DB中的字段,而是DB中有一个字段是文件路径,检索这个路径下的文件。所以这样就会造成 先按关键字全文检索出匹配的文件, 然后根据文件和DB对应的ID 去DB把对应的数据查询出来,这时候查询出来的数据就可能会很多,当然可以不全部查出来,但是检索后的和DB对应的ID要保存起来吧,这个ID的保存就很麻烦。不知道我说清楚没··· 
      

  12.   

    我的理解是这样的:我用关键字“test1”在Lucene里找到1 test g:/file/test1.txt,再用id=1,name=g:/file/test1.txt 去数据库里把文件的内容取出来,之后要把id和name保存起来?是这样吗?
    红色部分不理解,你是要保存数据库里找到的id呢还是Lucene里找到的id?
      

  13.   

    我用Lucene 不是检索数据库 是检索的数据库存放路径的那个文件 也就是test1.txt 这个文件。
    文件和数据库的记录ID已经通过文件名的命名可以进行关联 即 一条记录的ID是1 他对应的文件名是test_1.txt,检索后并处理后我将会得到一个数据库ID的集合,这时候我再去数据库里把对应的记录查询并显示出来,问题就是得到的这个ID集合可能会很多,所以分页不好做
      

  14.   

    那可能你要重新设计你的数据库索引了,我的做法是先把数据库里的数据取一些字段做成索引,当用lucene查询这个时会得到一些id,还有其他的字段,先将这些显示出来,要看详细的再去数据库里取。不过我是做网站的,不知道你是不是做网站的。如果是,这样应该可以。对于分页,lucene会根据你设置的参数帮你分页,不需要你自己分页。
      

  15.   

    对于分页,lucene会根据你设置的参数帮你分页,不需要你自己分页。
    不知道你说的那个版本 或者可以推荐篇文章吗
    我看到lucene的分页方式 就是缓存+多次查询
      

  16.   

    其实你用分页把lucene查到的数据分成100条一页,也就100页,再自己加一个条件比如按时间排序最接近当前日期的优先显示,这样可以减少数据量,一万条数据,查到的数据也太多了吧,建议缩小范围。问题应该是你查到的数据量太大,如果少点就可以做很多事了。
      

  17.   

    额 不是我查到的多 是他确实很多
    一天的数据量是1千万条 查出来一万条 不多吧···
    看来缓存是必须的了 打算用mecache