1

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

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

任何建议将不胜感激。

4

3 回答 3

2

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

于 2013-09-11T02:58:06.113 回答
2

由于您允许基于文本进行搜索——我猜这意味着它们可以匹配一个子字符串,而不必指定要匹配的整个字符串——这比每个字段都有一个明确定义的问题要困难得多一组可能的值。如果是扑克牌,花色是一种类型,另一种是等级。在这种情况下,您可以为每个属性值维护一组卡片。比如, Set<Card> hearts, Set<Card> clubs,Set<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

于 2013-09-11T03:06:01.810 回答
1

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

http://www.h2database.com/

于 2013-09-11T10:24:48.073 回答