【问题标题】:inverted index sets - querying key prefixes倒排索引集 - 查询键前缀
【发布时间】:2015-04-20 17:48:29
【问题描述】:

我使用Redis 来为单词和包含这些单词的文档构建倒排索引系统。

设置非常简单:Redis Sets 其中Set 的键是:i:wordSet 的值是文档ID 有这个词的

假设我有 2 套:i:examplei:result

query - "example result" 将与 i:examplei:result 相交并返回所有同时具有 example 和 result 作为成员的 id

但我正在寻找的是一种执行(以有效方式)查询的方法,例如:“ex res”。结果集应至少包含查询 "example result"

中的所有 id

我想到的解决方案:

  • 创建大小为 2 的前缀集p:ex - contains {"example", "expertise", "ex"...}。查找运行时间不会成为问题 - O(1) 获取集合,O(n) 检查集合中的所有元素以查找以前缀开头的单词(其中n = set.size()),但我担心增加的尺寸价格。

  • 使用扫描:但我不确定运行时间 - 像 scan 0 match ex* 这样的查询将花费 O(n) where n is the number of keys in the db?我知道 redis 很快,但它可能不是像 "ex machi cont" 这样的查询的优化解决方案。

【问题讨论】:

    标签: search redis


    【解决方案1】:

    解决此问题的通常方法是您提到的第一种方法,但通常您会使用 3+ 个字符长的段。请注意,您需要为每个段设置一个集合,即i:exai:exami:exampi:exampl,当然还有i:example

    这自然会占用您数据库中的空间(因此建议从 3 个字符而不是 2 个字符开始)。一个可能的调整是在 i:len(3) 集合中只保留对 i:len(4+) 集合的引用,而不是文档 ID。这将需要更多的读取操作,但会显着节省 RAM。

    您应该探索 v2.8.9 为 Sorted Sets 添加的字典范围。通过调用ZRANGEBYLEX,您可以获得成员范围(即所有以 ex 开头的单词)。虽然这本身在这种情况下可能很有用,但请考虑您也可以创造性地使用排序集的成员来对单词及其文档引用进行编码。这可以帮助您克服分数的“损失”(因为所有分数都需要相同才能使词典排序起作用)。例如,假设文档 1 和 2 中的单词“bed”和“beg”:

    ZADD index 0 "beg:1" 0 "bed:2"
    

    最后,还有一点需要考虑 - 添加后缀搜索(例如,以“ample”结尾的所有内容):https://redislabs.com/blog/how-to-use-redis-at-least-x1000-more-efficiently

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多