我是db4o和Lucene的新手。
目前我正在使用db4o将我的数据保存在Android应用上。我需要能够执行快速搜索,并向用户提供建议(例如,自动完成建议)。
一张SO海报提到使用Lucene索引数据和db4o来存储它。
有没有人实施过这种方法?如果是的话,如果他们分享整体方法,我将不胜感激?有哪些替代方案?
答案 0 :(得分:3)
我使用Lucene从要存储在数据库中的项目中提取关键字,并存储我称之为“关键字扩展”的对象,这些对象指向相应的域对象。这使得域对象可以通过关键字找到(也允许词干),并将关键词关注点分开。该数据库是从一个大型静态数据集(美国农业部食品营养数据库)构建的,所以我不需要担心运行期间的变化。因此,这种解决方案的当前形式受到限制......
解决方案的第一部分是编写一小段代码,这些代码需要一些文本,并将两个关键字和相应的词干(使用Lucene的'Snowball'词干)提取到地图中。您可以使用它从您存储在数据库中的某些域对象中提取关键字/词干。我保留了原始关键字,以便我可以为搜索创建某种统计信息。
第二部分是构建我称为“关键字扩展”的对象,它将词干存储为数组,相应的关键字存储为另一个数组,并指向具有关键字的相应域对象(我使用数组因为它们有效更容易使用DB4O)。我还将我的KeywordExtension类子类化为对应于特定域对象的类型 - 例如,我存储了一个'Nutrient'域对象和一个相应的'NutrientKeywordExtension'对象。
第三部分是收集用户输入的搜索文本,再次使用词干分析器提取词干,并使用这些词干搜索NutrientKeywordExtension对象。然后,您可以抓取这些扩展指向的Nutrient对象,最后将它们显示为搜索结果。
正如我所说,我的数据库是静态的 - 它是在应用程序第一次运行时创建的。在动态数据库中,您需要担心保持营养素和相应的关键字扩展名同步。一种解决方案是将营养素和营养素关键字扩展合并到一个类中,如果你不介意在你的域对象中有这些东西(我不喜欢这个)。否则,每次创建/编辑/删除域对象时,都需要考虑关键字扩展。
我希望这个有限的例子有所帮助。