【问题标题】:Most efficient way to store and search a large collection of objects in Java [closed]在 Java 中存储和搜索大量对象的最有效方法 [关闭]
【发布时间】:2013-09-11 02:42:28
【问题描述】:

我目前正在开发一个程序,该程序允许用户搜索非常大的交易卡集合(约 100,000 个对象)并选择他们选择的卡添加到套牌文件中。

我的问题是,存储这些对象以获得最佳搜索时间的最有效方法是什么?我需要能够在每个对象中搜索与给定搜索字符串输入匹配的多个可能值(卡片信息字段,例如名称、类型、规则文本等),并返回与搜索字符串匹配的所有卡片。

任何建议将不胜感激。

【问题讨论】:

  • 嵌入式数据库?类似于 HSQL 或 SQLite。
  • 嵌入意味着它是本地磁盘上的一个文件来存储数据库和一个包含在您的应用程序中的jar文件来访问该文件。没有单独的服务器(甚至进程)。查看 Derby(JavaDB) 或 HSQL 的介绍文章。
  • 使用嵌入式数据库,您可以使用 lucene
  • 三个答案(在我写这篇文章的时候)都是有效的方法,你只需要决定是要建造还是购买。此外,不同的方法将扩展不同。一切都很好,但您还需要满足其他要求。

标签: java


【解决方案1】:

由于您允许基于文本进行搜索——我猜这意味着它们可以匹配一个子字符串,而不必指定要匹配的整个字符串——这是一个比每个字段都有一个更困难的问题定义明确的一组可能的值。如果是扑克牌,花色是一种类型,另一种是等级。在这种情况下,您可以为每个属性值维护一组卡片。例如,Set<Card> heartsSet<Card> clubsSet<Card> threes 等。如果有任何此类字段,您可以让他们从下拉列表中进行选择,这将大大减少搜索时间。 (给我一组六杆与一组梅花相交,现在搜索那些匹配 X 的文本。)

对于确实需要进行文本搜索的字段,最好根据值中的每个单词保留索引。例如,如果一张卡的“字符”值包含“卢克·天行者,绝地武士”(卡号 96),另一张是“梅斯·温杜,绝地大师”(卡号 97),那么您将保留如下数据结构:

Map<String, Set<Cards>> characterTerms

有(K,V)这样的条目:

"luke" -> [96]
"skywalker" -> [96]
"jedi" -> [96,97]
"knight" -> [96]
"mace" -> [97]
"windu" -> [97]
"master" -> [97]

然后,当对"Skyw*" 提交搜索时,您可以遍历characterTerms 映射中的键以查看哪个具有"skyw" 的子字符串。在这种情况下,第二个条目。所以你拿那组卡片,看看哪些符合指定的其余条件。

进行这种全文搜索的一个很好的库是Apache Lucene

【讨论】:

  • 与其对它们进行迭代,不如对characterTerms 中的键进行排序。如果你想支持匹配“ace”到“mace”,它可以是一个较慢的二次搜索。
  • 好点。我假设你总是做部分匹配。
【解决方案2】:

我会查看 Elasticsearch(我的偏好)或 mongoDB。两者都是针对搜索和轻松存储而优化的 json 文档存储。它们都是具有易于使用的 java 客户端 API 的开源项目。将您的卡片数据存储为 JSON 对象,然后将这些对象保存在任一存储中应该是一个简单的步骤。

【讨论】:

  • 我相信你的意思是 MongoDB。
  • @AmirPashazadeh 是的,已更正
【解决方案3】:

使用嵌入式 H2 数据库引擎来保存和搜索您的卡片。

http://www.h2database.com/

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2014-03-03
    • 2017-01-06
    • 2012-03-11
    • 2018-10-21
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多