【问题标题】:How do I combine usage of db4o to store data and Lucene to index data for fast search?如何结合使用 db4o 来存储数据和 Lucene 来索引数据以进行快速搜索?
【发布时间】:2011-08-13 21:02:03
【问题描述】:

我是 db4o 和 Lucene 的新手。

目前我正在使用 db4o 将我的数据保存在 Android 应用程序上。我需要能够执行快速搜索以及向用户提供建议(例如,自动完成建议)。

一个 SO 海报提到使用 Lucene 来索引数据和 db4o 来存储它。

有没有人实施过这种方法?如果是的话,如果他们分享整体方法,我将不胜感激?有哪些替代方案?

【问题讨论】:

  • 我会只使用 lucene 作为数据存储。不需要 db4o 或者你为什么要使用一个? (只需将文档作为 json 存储到一个存储且未索引的可能压缩字段中)

标签: android architecture lucene db4o


【解决方案1】:

我使用 Lucene 从要存储在数据库中的项目中提取关键字,并存储我所谓的“关键字扩展”对象,这些对象指向相应的域对象。这使得域对象可以通过关键字找到(也允许词干提取),并分离关键字关注点。该数据库是从一个大型静态数据集(美国农业部食品营养数据库)构建的,因此我无需担心运行期间的变化。因此,此解决方案在其当前形式上受到限制...

解决方案的第一部分是编写一小段代码,获取一些文本并提取both关键字和相应的词干(使用 Lucene 的“Snowball”词干提取)到地图中。您可以使用它从存储在数据库中的某些域对象中提取关键字/词干。我保留了原来的关键字,这样我就可以对搜索结果进行某种统计。

第二部分是构建我称为“关键字扩展”的对象,将词干存储为一个数组,将相应的关键字存储为另一个数组,并有一个指向具有关键字的相应域对象的指针(我使用数组,因为它们可以工作使用 DB4O 更容易)。我还对我的 KeywordExtension 类进行了子类化以对应于特定域对象的类型 - 例如,我存储了一个“Nutrient”域对象和一个相应的“NutrientKeywordExtension”对象。

第三部分是收集用户输入的搜索文本,再次使用词干提取器提取词干,并用这些词干搜索 NutrientKeywordExtension 对象。然后,您可以获取这些扩展指向的 Nutrient 对象,最后将它们显示为搜索结果。

正如我所说,我的数据库是静态的——它是在应用程序第一次运行时创建的。在动态数据库中,您需要担心保持营养素和相应的关键字扩展同步。如果您不介意在域对象中包含这些内容(我不喜欢这样),一种解决方案是将营养和营养关键字扩展合并到一个类中。否则,您每次创建/编辑/删除域对象时都需要考虑关键字扩展。

我希望这个有限的例子有所帮助。

【讨论】:

  • @Sam - 感谢您的回复。你能告诉我索引的大小以及在手机上建立初始索引需要多少时间。
  • @Soumyama 在这种情况下的索引由一组 KeywordExtension 对象体现。数据库中有更多数据,我还没有弄清楚这些特定对象占用了多少空间。在任何情况下,我怀疑大部分空间都被 555,726 个营养条目对象占用,导致一个 45 MB 的数据库文件。这一切都在 Granite Web 应用程序上(Granite 是我们自己的开源 Scala/Wicket/DB4O 堆栈),而不是在手机上。在 6 核桌面上从头开始生成整个 DB4O 数据库只需要一分钟多的时间。
  • @Sam - 这是有用的信息。 45 MB 是 DB4O db 文件大小还是 Lucene 索引的大小?
  • @Soumya 45 MB 是 DB4O db 文件的总大小
  • @Sam - 谢谢。你能告诉我 Lucene 索引的大小吗?
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多