我目前正在开发一个程序,允许用户搜索非常大的集合(约100,000个对象)的交易卡,并选择他们选择的卡片添加到套牌文件中。
我的问题是,存储这些对象以获得最佳搜索时间的最有效方法是什么?我需要能够在每个对象中搜索与给定搜索字符串输入匹配的多个可能值(卡信息字段,如名称,类型,规则文本等),并返回与搜索字符串匹配的所有卡。
任何建议都将受到赞赏。
答案 0 :(得分:2)
因为您允许基于文本进行搜索 - 我猜这意味着它们可以匹配子字符串而不必指定要匹配的整个字符串 - 这是一个比每个字段都有一个问题要困难得多的问题明确定义的可能值集。如果是扑克牌,套装将是一种类型而另一种是等级。在这种情况下,您可以为每个属性值维护一组卡片。例如,Set<Card> hearts
,Set<Card> clubs
,Set<Card> threes
等。如果有任何类型的字段,您可以从下拉列表中选择,这将大大缩短搜索时间。 (给我一组与俱乐部相交的六人组,现在搜索那些与X匹配的文本。)
对于需要进行文本搜索的字段,最好根据值中的每个单词保留索引。例如,如果一张牌的“角色”值包含“Luke Skywalker,Jedi Knight”(Card id 96)而另一张牌是“Mace Windu,Jedi Master”(Card id 97),那么你会保留一个类似这样的数据结构: / p>
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。
答案 1 :(得分:1)
我会看看Elasticsearch(我的偏好)或mongoDB。两者都是为搜索和轻松存储而优化的json文档存储。它们都是易于使用的Java客户端API的开源项目。将卡数据存储为JSON对象应该是一个简单的步骤,然后将这些对象保存在任一商店中。
答案 2 :(得分:0)
使用嵌入式H2数据库引擎来保存和搜索您的卡片。