gpt4 book ai didi

android - 我如何结合使用 db4o 来存储数据和 Lucene 来索引数据以进行快速搜索?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:54 25 4
gpt4 key购买 nike

我是 db4o 和 Lucene 的新手。

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

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

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

最佳答案

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

解决方案的第一部分是编写一小段代码,获取一些文本并将关键字和相应的词干(使用 Lucene 的“Snowball”词干提取)提取到 map 中。您可以使用它从存储在数据库中的某些域对象中提取关键字/词干。我保留了原始关键字,以便我可以对所做的搜索创建某种统计数据。

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

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

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

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

关于android - 我如何结合使用 db4o 来存储数据和 Lucene 来索引数据以进行快速搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com