【问题标题】:Advice on how to search and return strings关于如何搜索和返回字符串的建议
【发布时间】:2015-10-09 21:28:48
【问题描述】:

请原谅,这将是我第一次向 SO 发帖,所以请告诉我如何改进。

我目前正在就我面临的问题寻求建议。我有一个包含十亿个唯一文本字符串的列表。这些文本字符串还有一个与之关联的标签列表,用于指示字符串的内容。

例子:

StringText: The cat ate on Sunday
AnimalCode: c001
ActionCode: a001
TimeCode:   d001

在哪里

c001 = The cat
a001= ate
d001 = on Sunday

我已将所有字符串及其代码作为单个文档加载到 MongoDB 实例中

目前,我正在尝试设计一种方法,通过该方法我可以输入字符串并在数据库中搜索以返回匹配项。我的问题是搜索需要很长时间才能返回结果。

我在 StringText 字段上创建了一个索引,但我猜测它太大而无法保存在内存中。

每个字符串都有相同的被搜索概率,因此我无法可靠地预测哪些字符串具有更高的搜索概率并将它们拉到另一个集合中。

目前,我在一个具有 16GB RAM 和 4TB HDD 的盒子上运行数据库。

有人对我如何更有效地完成任务有任何建议吗? Mongo 是正确的技术,还是有其他更擅长进行这种搜索和返回的技术?

我的目标(如果愚蠢,请原谅我)是尝试在 2 秒或更短的时间内返回结果。

我对整个领域都很陌生,因此欢迎任何和所有建议。

非常感谢大家的帮助和时间。

真诚地, 辛加

【问题讨论】:

  • 如果基于StringText进行搜索,那么Animal、Action和Time code的用途是什么?
  • 嗨,galactocalypse...这些代码用于将该短语链接到另一个数据库中具有相似含义的其他短语。即 c001 = cat 并且还链接到“猫”等的另一个代码等。目标是将字符串映射到其编码值。
  • 所有输入句子的结构都应该一样吗?
  • 输入总是需要至少一个动物和一个动作。天将是可选的。因此,如果输入是“The cat ate”,结果将返回“The cat ate on Sunday”、“The cat ate on Monday”、“The cat ate on Tuesday”等(猫似乎很饿)。这回答了你的问题吗?
  • 是的,确实如此。您是否考虑过预处理输入字符串以查找相关的 AnimalCode、ActionCode 和可选的 TimeCode,以使即将进行的搜索直接依赖于索引代码而不是繁琐的文本搜索?

标签: string mongodb search indexing


【解决方案1】:

如 cmets 中所述,您可以对输入字符串进行预处理以查找关联的 Animal 和 Action 代码,并根据索引代码搜索 StringText,这比文本搜索要快得多。

您不能完全避免文本搜索,因此通过对输入字符串进行标记化将其简化为 Animal 和/或 Action 集合。了解如何将 map/reduce 技术仅用于此类查询。

在您的情况下,如果您知道第一个或两个单词将始终包含动物的名称,只需使用这一个或两个单词来搜索相关的动物。搜索 Animal/Actions 集合应该不会花很长时间。如果确实如此,您可以定期更新最常见的动物/动作列表(基于它们的频率)并对其进行搜索以使其更快。这也在链接页面上的文章中进行了讨论。

即使在此之后您对 StringText 的搜索速度很慢,您也可以通过 Animal/Action 代码对 StringText 集合进行分片。 official doc 应该足够了,而且设置中涉及的内容并不多,所以无论如何你都可以尝试一下。 任何地方的基本思想都是尽可能地限制您的目标空间。为每个查询搜索十亿条记录显然是矫枉过正。尽可能缓存,尽可能预处理,在运行慢查询时显示猜测。

祝你好运!

【讨论】:

  • 真棒半乳糖。我要开始一场盛大的冒险了。谢谢你的地图。当我获得足够的代表时,我会回到这里并为你 +1。
  • 很高兴为您提供帮助!您将有大量的查询。祝你好运。
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 2019-09-17
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多