【问题标题】:Java: from Lucene Hits to original objectsJava:从 Lucene Hits 到原始对象
【发布时间】:2009-09-24 15:10:59
【问题描述】:

我想使用 Lucene 在我的应用程序中实现过滤/搜索功能。

查询 Lucene 索引会给我一个 Hits 实例,它只不过是一个符合我的条件的 Documents 列表。

由于我从我的对象生成索引Documents,这是查找与特定Lucene Document相关的原始对象的最佳方法?


更好地描述我的情况:

  • 目前有三个模型类:Folder(可以有其他 Folders 或 Lists 作为孩子),List(可以有Tasks 作为孩子)和 Task(可以有其他Tasks 作为孩子)。他们都是 DefaultMutableTreeNode 子类。我将添加Tag 实体 未来。
  • 每个Task 都有一个文本、一个开始日期、一个截止日期和一些布尔标志。
  • 它们显示在JTree 中。
  • 孔树保存在 XML 文件中。
  • 我想做这样的事情:
  • 使用类似 Google 的查询搜索 Tasks。
  • 查找所有从今天开始的Tasks。
  • Tag 过滤Tasks。

【问题讨论】:

  • 从你的cmets,我想我更了解你在做什么。你能描述一下你用 Lucene “索引”了哪些字段吗?你能再描述一下你提供的 UI 吗?我假设您显示了一个树,但是通过在字段中输入文本,用户可以获得在其标签中有一些匹配的叶节点列表。那准确吗?匹配必须准确吗?您是否使用了 Lucene 的功能,例如词干提取和标记化?

标签: java search lucene document


【解决方案1】:

你不能,不能用香草 Lucene。您自己说您将您的对象转换为 Documents,然后将 Documents 存储在 Lucene 中,您如何想象这个过程是可逆的?

如果您想在 Lucene 中存储和检索自己的对象,我强烈建议您改用 Compass。 Compass 之于 Lucene 就像 Hibernate 之于 JDBC - 您定义对象和 Lucene 文档之间的映射,Compass 负责转换。

【讨论】:

  • Hibernate Search 之于信息检索就像 Hibernate 之于关系数据库。我没有深入研究过 Hibernate Search,但我看过 Compass,我相信它通过实现基于 JDBC 的 Directory 而不是 IndexReader 犯了一个根本的设计错误。我真的不鼓励使用 Compass。
  • Compass 可以使用您选择的任何 Lucene 目录,基于 JDBC 的目录只是一种选择。您还可以使用 RAM 目录和 FileSystem 目录。如果这是您反对 Compass 的依据,那么您这样做的信息有误。
  • Hibernate Search 是用来索引 Hibernate 数据库的,它不是一种通用的索引机制。 Lucene(和 Compass)是。
  • 如果使用其他目录,索引和存储实体之间的原子性如何保持?
  • 听起来很有趣,我会研究一下!
【解决方案2】:

添加一个包含对象标识符的“存储”字段。对于每个命中,通过标识符查找原始对象。

如果不了解更多上下文,很难更具体。

【讨论】:

  • 是的,这是最简单的方法。我想您可以将对象序列化为文档,然后重新创建它们,但这听起来是个糟糕的设计。
  • 由于我的对象存储在树中,我应该遍历孔树以找到我正在寻找的对象。这将使 Lucene 无用。
  • 几乎没有。 Lucene 是一个信息检索系统。它的数据结构不同于用于通过键有效查找记录的数据结构。我不确定您指的是哪种“树”,但如果您的意思是java.util.TreeMap,而不是遍历整棵树,您将获得 O(log n) 查找(或 O(1) 查找,如果您切换到HashMap)。如果您在磁盘上使用 B-Tree,则类似的故事。 Lucene 提供了许多单独的树无法提供的功能:标记化、词干提取、相关性排名等。如果差异不明显,您可能会错误地使用其中一个或另一个。
  • 我想使用 Lucene 在树中查找对象(一个 DefaultTreeModel),这样我就可以避免穿过它。我想说的是,如果我不得不走树来获取与 Lucene 返回的文档相对应的对象,这将是无用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2017-09-18
  • 1970-01-01
  • 2011-05-01
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多