Android 如何结合使用db4o存储数据和Lucene索引数据进行快速搜索?

Android 如何结合使用db4o存储数据和Lucene索引数据进行快速搜索?,android,architecture,lucene,db4o,Android,Architecture,Lucene,Db4o,我对db4o和Lucene都是新手 目前,我正在使用db4o将我的数据持久化到一个Android应用程序上。我需要能够执行快速搜索,以及向用户提供建议(例如,自动完成建议) 一张SO海报提到使用Lucene索引数据并使用db4o存储数据 有人实施过这种方法吗?如果是的话,我希望他们能分享整个方法?有哪些替代方案?我使用Lucene从要存储在数据库中的项中提取关键字,并存储指向相应域对象的我称之为“关键字扩展”的对象。这使得域对象可以通过关键字查找(也允许词干),并分离了关键字关注点。该数据库是从

我对db4o和Lucene都是新手

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

一张SO海报提到使用Lucene索引数据并使用db4o存储数据


有人实施过这种方法吗?如果是的话,我希望他们能分享整个方法?有哪些替代方案?

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

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

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

第三部分是收集用户输入的搜索文本,再次使用词干分析器提取词干,并使用这些词干搜索NutrientKeywordExtension对象。然后,您可以获取这些扩展所指向的营养对象,并最终将其作为搜索结果呈现

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


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

@Sam-感谢您的回复。你能告诉我索引的大小以及在手机上建立初始索引所需的时间吗。@Soumyama本例中的索引由一组关键字扩展对象体现。数据库中有更多的数据,我还没有计算出这些特定对象占用了多少空间。在任何情况下,我怀疑大部分空间都会被555726个营养素条目对象占用,从而生成一个45MB的数据库文件。这一切都在Granite web应用程序上(Granite是我们自己的开源Scala/Wicket/DB4O堆栈),而不是在手机上。在6核桌面上,从头开始生成整个DB4O数据库只需一分钟多。@Sam-这是有用的信息。45 MB是DB4O db文件大小还是Lucene索引的大小?@Soumya 45 MB是DB4O db文件的总大小size@Sam-谢谢。你能告诉我Lucene索引的大小吗?我将只使用Lucene作为数据存储。不需要db4o,或者为什么要使用db4o?(只需将文档作为json存储到一个已存储且无索引的压缩字段中)