gpt4 book ai didi

redis - 使用 Redis 进行复合查询

转载 作者:IT王子 更新时间:2023-10-29 05:59:59 26 4
gpt4 key购买 nike

出于学习目的,我尝试在 Redis 中编写一个简单的结构化文档存储。在我的示例应用程序中,我正在为数百万个文档编制索引,这些文档看起来有点像以下内容。

<book id="1234">
<title>Quick Brown Fox</title>
<year>1999</year>
<isbn>309815</isbn>
<author>Fred</author>
</book>

我正在编写一种小的查询语言,它允许我说 YEAR = 1999 AND TITLE="Quick Brown Fox"(同样,只是为了我的学习,我不在乎我' m 重新发明轮子!),这应该返回匹配文档的 ID(在本例中为 1234)。 ANDOR 表达式可以任意嵌套。

对于每个文档,我按如下方式生成 key

BOOK_TITLE.QUICK_BROWN_FOX = 1234
BOOK_YEAR.1999 = 1234

我正在使用 SADDKEYNAME.VALUE = { REFS } 的形式将这些文档放入一系列集合中。

当我进行查询时,我将表达式解析为 AST。 YEAR=1999 等简单表达式直接映射到 SMEMBERS命令让我返回匹配文档集。但是,我不确定如何最有效地执行 AND 和 OR 部分。

给定一个查询,例如:

(TITLE=Dental Surgery OR TITLE=DIY Appendectomy)
AND
(YEAR = 1999 AND AUTHOR = FOO)

我目前向 Redis 发出以下请求以回答这些查询。

-- Stage one generates the intermediate results and returns RANDOM_GENERATED_KEY3
SUNIONSTORE RANDOMLY_GENERATED_KEY1 BOOK_TITLE.DENTAL_SURGERY BOOK_TITLE.DIY_APPENDECTOMY
SINTERSTORE RANDOMLY_GENERATED_KEY2 BOOK_YEAR.1999 BOOK_YEAR.1998
SINTERSTORE RANDOMLY_GENERATED_KEY3 RANDOMLY_GENERATED_KEY1 RANDOMLY_GENERATED_KEY2

-- Retrieving the top level results just requires the last key generated
SMEMBERS RANDOMLY_GENERATED_KEY3

当我遇到 AND 时,我使用 SINTERSTORE基于两个子键(同样对于 OR 我使用 SUNIONSTORE )。我随机生成一个 key 来存储结果(并设置一个短的 TTL,这样我就不会用垃圾填满 Redis)。在这一系列命令结束时,返回值是一个键,我可以用它来检索 SMEMBERS 的结果。 .我使用存储功能的原因是我不想将所有匹配的文档引用传输回服务器,所以我使用临时键将结果存储在 Redis 实例上,然后只带回匹配结果结束。

我的问题很简单,这是将 Redis 用作文档存储的最佳方式吗?

最佳答案

我正在对排序集使用类似的方法来实现全文索引。总体方法很好,但您可以进行一些相当简单的改进。

  • 您可以使用查询(或其缩写形式)作为 key ,而不是使用随机生成的 key 。这让您可以重复使用已经计算过的集合,如果您对通常以类似方式组合的两个大型集合进行查询,这可以显着提高性能。
  • 将标题作为一个完整的字符串来处理会导致大量的单个成员集。如果确实需要,最好为标题中的单个单词编制索引并过滤最终结果以获得完全匹配。

关于redis - 使用 Redis 进行复合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com