Search 反向索引集-查询键前缀

Search 反向索引集-查询键前缀,search,redis,Search,Redis,我正在使用Redis为单词和包含这些单词的文档建立一个反向索引系统 设置非常简单:Redis Set其中集合的键是:i:word,而集合的值是包含该单词的文档ID 假设我有两组:i:example和i:result 查询-“示例结果”将与i:example和i:result相交,并返回所有同时包含示例和结果的ID作为成员 但我要寻找的是一种(以高效的方式)执行查询的方法,如:“ex res”。结果集应至少包含查询“示例结果”中的所有ID 我想到的解决方案: 创建大小为2的前缀集:p:ex-包含

我正在使用Redis为单词和包含这些单词的文档建立一个反向索引系统

设置非常简单:
Redis Set
其中
集合的键是:i:word,而
集合的值是包含该单词的文档ID

假设我有两组:
i:example
i:result

查询-“示例结果”
将与
i:example
i:result
相交,并返回所有同时包含示例和结果的ID作为成员

但我要寻找的是一种(以高效的方式)执行查询的方法,如:“ex res”。结果集应至少包含查询“示例结果”中的所有ID

我想到的解决方案:

  • 创建大小为2的前缀集
    p:ex-包含{“示例”、“专家”、“ex”…}
    。查找运行时间不会有问题-
    O(1)
    获取集合和
    O(n)
    检查集合中所有元素是否以前缀开头(其中
    n=set.size()
    )但我担心增加的大小价格

  • 使用scan:但我不确定运行时间-像
    scan 0 match ex*
    这样的查询将需要O(n)?我知道redis速度很快,但它可能不是像“ex machi cont”这样的查询的优化解决方案


    • 通常的方法是您提到的第一种方法,但通常您会使用3个字符长的分段。请注意,您需要为每个片段设置一组,例如
      i:exa
      i:exam
      i:examp
      i:exampl
      ,当然还有
      i:example

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

      您应该了解v2.8.9为排序集添加的词典范围。通过调用,您可以获得成员范围(例如,所有以ex开头的单词)。虽然这在本上下文中可能是有用的,但也可以考虑使用您的排序集合的成员来创造性地编码一个单词及其文档引用。这可以帮助您克服分数的“丢失”(因为所有分数都需要相同才能按字典顺序排列)。例如,假设文件1和文件2中的“bed”和“beg”字样:

      ZADD index 0 "beg:1" 0 "bed:2"
      
      最后,这里还有一点需要考虑-添加后缀搜索(例如,所有以“sample”结尾的内容):