原谅我,这将是我的第一篇文章,所以请告诉我如何改进。
我正在寻找有关我所面临问题的建议。我有一个包含十亿个独特文本字符串的列表。这些文本字符串还有一个与它们关联的标记列表,用于指示字符串的内容。
示例:
StringText: The cat ate on Sunday
AnimalCode: c001
ActionCode: a001
TimeCode: d001
其中
c001 = The cat
a001= ate
d001 = on Sunday
我已将所有字符串及其代码作为MongoDB实例中的单个文档加载
目前,我正在尝试设计一种方法,通过该方法我可以输入字符串并搜索数据库以返回匹配项。我的问题是搜索结果需要很长时间才能返回结果。
我在StringText字段上创建了一个索引,但我猜测它太大而无法保存在内存中。
每个字符串具有相同的搜索概率,因此我无法可靠地预测哪些字符串被搜索的概率更高,并将其拉出到另一个集合中。
目前,我正在使用16GB内存和4TB硬盘的单个机箱运行数据库。
有没有人对如何更有效地完成任务有任何建议? Mongo是正确的技术还是其他人更善于进行这种搜索和返回?
我的目标(如果愚蠢的话,原谅我)会尝试在2秒或更短的时间内返回结果。
我对整个竞技场都很陌生,所以欢迎任何建议。
非常感谢所有人提前获得帮助和时间。
此致 锌加
答案 0 :(得分:1)
正如评论中所讨论的,您可以预处理输入字符串以查找关联的动物和动作代码,并根据索引代码搜索StringText,这比文本搜索快得多。
您无法完全避免文本搜索,因此请通过标记输入字符串将其缩减为Animal和/或Action集合。了解如何仅针对此类查询使用map/reduce技术。
在您的情况下,如果您知道第一个或第二个字总是包含动物的名字,只需使用这一个或两个词来搜索相关动物。搜索动物/动作集合不应该花费很长时间。如果是这样,您可以定期更新最常见的动物/动作列表(基于它们的频率)并搜索它以使其更快。这也在链接页面上的文章中讨论。
如果在此之后您对StringText的搜索速度很慢,您可以按动物/动作代码对StringText集合进行分片。 official doc应该足够了,并且设置中没有太多内容,所以无论如何你都可以试试这个。 各地的基本意识形态都是尽可能地限制你的目标空间。为每个查询搜索十亿条记录显然有点过分。尽可能缓存,预处理,在运行慢查询时显示猜测。
祝你好运!