2012-07-05 102 views
0

我有一个包含文档列表的应用程序。这些文件是使用Lucene索引的 。 我可以搜索文档的关键字。我循环了TopDocs并获得了与我的 关系数据库中的ID列相关的每个Lucene doc的 ID字段。从所有这些ID中,我创建一个列表。 建筑ID的名单后,我会把它执行 数据库查询下面的SELECT语句(JPA):将Lucene搜索结果与关系数据库进行映射

SELECT d From Document WHERE id IN (##list of ID's retrieved from Lucene##) 

的文档此列表发送到视图(GUI)。

但是,一些文件是私人的,不应该在列表中。因此, 我们在SELECT查询一些额外的语句,做一些安全 检查:

SELECT d From Document WHERE id IN (##list of ID's retrieved from Lucene##) 
AND rule1 = foo 
AND rule2 = bar 

但现在我想知道:我使用Lucene的速度快速搜索 文件,但我仍然必须做SELECT查询。所以我失去了 表现在这一个:-(... 是否有一些组件可以为你做这个映射?或者 有关于这个问题的任何最佳实践?大项目如何将Lucene 结果映射到关系型数据库?因为视图应该渲染 结果?

非常感谢!

约亨

+1

你担心什么样的表现打击? Lucene是用于索引的,理想情况下,你将拥有一个数据库或文件系统。如果Lucene下的关系数据库是您系统其余部分的合适选择,那么您描述的是正确的做事方式。 – dfb 2012-07-05 20:07:11

+0

嗯,我想我可以使用Lucene,所以我不需要一个MySQL查询。只需从Lucene索引中获取所有Document属性/细节。但由于额外的检查,我们需要执行额外的MySQL查询。 – 2012-07-10 10:21:23

回答

0

几点建议:

  • 在Lucene中,你可以使用一个Filter根据自己的规则来缩小搜索结果。
  • 将主键或唯一键(ID,序列号等)存储在Lucene中。然后,您的关系数据库可以进行独特的密钥查找并使事情变得非常快速。
  • Lucene也可以充当您的文档存储。如果适用于您的情况,您只需从Lucene中检索各个文档的内容,而无需转至关系数据库。
+0

Lucene可以存储一个Java对象吗?因为你告诉我:“Lucene也可以用来存储你的文档”。 Document.java是一个拥有我的实际文档(PDF,TXT,...)的一些属性的类。我认为你指的是文档的文本表示,而不是Java对象... – 2012-07-10 10:14:44

+0

是的。对于每个文档的每个字段,Lucene可以将该字段的内容存储为Java字符串或字节数组。查看[Field类的javadoc](http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/document/Field.html)。如果您有一些平面文本(例如纯文本或HTML),则Lucene可以将其存储为字符串。或者,如果您有Java对象,则可以将其序列化(例如,使用ObjectOutputStream和ByteArrayOutputStream)到一个字节数组中,并且Lucene可以存储该字节数组。然后,在搜索时,一旦拥有文档ID和字段名称,就可以向Lucene提供字符串/字节数组。 – 2012-07-10 17:33:26

+0

谢谢!那很有意思 – 2012-07-11 08:27:21

0

你为什么不数据库使用Lucene来索引的表?这样,你可以做1 lucene查询中的所有内容。

+0

安全限制不在1个单独的表中。安全规则传播到我的数据库中(进入其他表格 - 我很抱歉,我的第一篇文章并没有那么清楚)。如果所有规则都在Document表上,那么我可以存储规则并执行一个Lucene查询 – 2012-07-10 10:16:59

0

如果这是一个大问题,也许值得看看ManifoldCF,它支持可能符合您需要的文档级安全性。

+0

谢谢Persimmonium,很有趣!:-) – 2012-07-10 10:17:45