【问题标题】:What data structure to use for indexing data for partial %infix% searching?使用什么数据结构来索引数据以进行部分 %infix% 搜索?
【发布时间】:2012-09-06 20:52:11
【问题描述】:

假设您有一个庞大的数据缓存,需要通过 4 种方式进行搜索:

  1. 完全匹配
  2. 前缀%
  3. %后缀
  4. %中缀%

我将Trie 用于前三种类型的搜索,但除了顺序处理大量元素之外,我不知道如何处理第四种类型。

【问题讨论】:

  • 只是一个简短的评论。对于 1 和 2,您可以使用 sargable 包含条件,例如 =LIKE '<literal>%'。这些通常允许优化器使用列上的索引。
  • myQuestion 可以多长时间?超过 10 个字符?
  • @Sloin 您在另一条评论中提到您收藏的平均大小为 5000(不大)。为什么不迭代(我会理解 100 000+)?
  • 您考虑过使用全文索引吗?这在大多数数据库中都可用。否则,将数据存储在具有足够 RAM 的机器中,以便将其全部放入内存中,而您不必担心扫描所有数据。
  • @anymeric:视情况而定,小企业会有 5000 个,但我们将其部署到大企业会有 50 000 个

标签: java data-structures indexing


【解决方案1】:

如果您的数据集很大,请使用像 Apache Solr 这样的搜索平台,这样您就不会陷入性能混乱。

【讨论】:

  • 我们讨论的是大小为 avg 的字符串集合。 5000. Lucene 在这里太过分了
  • 我只需要 lucene 用于我需要的算法和数据结构。也许我可以看看它。问题是这种模式搜索并没有真正的名字......
  • 我在全文搜索中阅读了这个page
  • 如果只有大约 5000 个字符串,为什么不尝试使用正则表达式匹配。
【解决方案2】:

您可以为 2(正常顺序的键)和 3(反向键)构建可导航的地图或集合(例如 TreeMap 或 TreeSet)

对于选项 4,您可以构建一个集合,其中每个起始字母都有一个键。您可以根据您的要求简化此操作。这可能会导致使用更多空间,但会获得 O(log n) 查找时间。

【讨论】:

  • 试图理解您对 4 的建议:如果现有字符串是“abcaae”,它会匹配所有 a、b、c 和 e 吗?
  • 对于“abcaae”,集合看起来像 { ae, aae, abcaae, bcaae, caae, e } 你用floorKey(toFind).startsWith(toFind)查找
【解决方案3】:

对于#4,我在想,如果您预先计算每个字符的出现次数,那么您可以在该表中查找在搜索字符串中至少有相同次数出现的字符。

此算法的效率可能取决于数据的性质和搜索字符串。在这里给出一些例子可能会有用,以获得更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2019-10-12
    • 2015-10-24
    • 2015-05-01
    相关资源
    最近更新 更多