gpt4 book ai didi

redis - 使用 RediSearch 对实体进行简单的字符串和整数索引

转载 作者:IT王子 更新时间:2023-10-29 06:09:21 25 4
gpt4 key购买 nike

我需要在 Redis 中存储简单的实体对象 (C#)。我还需要使用二级索引和精确匹配来搜索它们。在与 Redis natvie 数据类型斗争之后,我选择尝试使用 RediSearch 来完成这项任务。

但是我找不到如何按照我需要的方式使用它。

我的目标很简单。实体数据结构非常简单。例如,我有一个 Device 类,听起来像这样(我省略了大多数不能被索引的字符串/整数字段,因此与示例无关):

public class Device 
{
public int Id { get; set; } // primary key
public string Name { get; set; } // no indexing on this
public string SerialNumber { get; set; } // this is indexed and unique
public string ServerNode { get; set; } // this is indexed
public int Status { get; set; } // this is indexed, possible values 0..4
public string Info { get; set; } // no indexing on this
}

我需要存储 Device 类的实例并检索它们:

  • 单独,按SerialNumber
  • 作为 ServerNode 和/或 Status 的列表

我正在从 MySQL 切换到 Redis,只是为了制作一个等效的 sql,我正在尝试复制这些 sql-where 子句中的任何一个:

  • WHERE SerialNumber = 'RK01:"12345678"'
  • WHERE ServerNode = 'Node-US-01'
  • WHERE 1 和 3 之间的状态
  • WHERE ServerNode = 'Node-IT-04' AND St​​atus = 4

我的项目是用 C# 编写的,我已经开始使用 StackExchange.Redis 和 NRediSearch 包。

我不知道如何创建正确的模式索引(通过 redis-cli),也不知道如何使用 NRediSearch Client 类正确存储实体。

我不需要任何全文或标记化/停用词/等。 RediSearch 的功能,只是“简单的纯文本”和整数索引。

我的第一个问题是字符串中存在标点字符(主要是连字符,但在某些情况下也有双引号)。

我创建了一个基于 TAGNUMERIC 字段类型的模式:

FT.CREATE Device NOHL NOOFFSETS NOFREQS STOPWORDS 0 SCHEMA Id NUMERIC SORTABLE SerialNumber TAG SORTABLE ServerNode TAG SORTABLE Status NUMERIC SORTABLE

我尝试通过 NRediSearch 添加“文档”(但也通过 redis-cli 进行测试),方法如下:

通过 redis-cli:

FT.ADD Device obj:Device:1 1.0 FIELDS Id 1 Name "FoobarDevice" SerialNumber "RK01:\"12345678\"" ServerNode "Node-US-01" Status 1 Info "this and that"

通过 NRediSearch

var rsc = new Client("Device", redis_database);
var doc = new Document("obj:Device:1");
doc.Set("Id", 1);
doc.Set("Name", "FoobarDevice");
doc.Set("SerialNumber", "RK01:\"12345678\"");
doc.Set("ServerNode", "Node-US-01");
doc.Set("Status", 1);
doc.Set("Info", "this and that");
rsc.AddDocument(doc);

如果我在 redis-cli 中键入任何这些命令,我​​会在屏幕上转储正确的设备实体:> FT.GET 设备对象:设备:1或者> HGETALL obj:Device:1

现在的问题是:我无法对这些索引执行任何查询。首先,我不清楚命令行上的正确查询语法;这里有一些不工作的例子:

>FT.SEARCH 设备@ServerNode:{Node-US-01}

>FT.SEARCH 设备“@ServerNode:{Node-US-01}”

>FT.SEARCH 设备@ServerNode:"{Node-US-01}"

>FT.SEARCH 设备@ServerNode:{"Node-US-01"}

>FT.SEARCH 设备@SerialNumber:{RK01:\"12345678\"}

我收到语法错误或没有结果。

我知道序列号字符串有点奇怪,但我无法更改其格式。

我应该在文档中存储字符串值的转义版本吗?哪一个是重现与类似 sql 的 where 子句相同结果的正确语法?我如何处理对值本身包含双引号 (") 的字段值进行字符串搜索?

最后但同样重要的是,我找不到任何关于使用 NRediSearch 查询类和 QueryBuilder 命名空间的说明示例或文档(但在我了解 RediSaerch 是如何“思考”之后,这可能会变得不那么模糊了)。

最佳答案

您对数据的索引很好,唯一的问题是您的搜索查询。您的数据包含 RediSearch 自动标记化的字符(如 -:)。为了避免标记化,您需要在查询中转义它们。请注意,当使用 redis-cli 时,您必须进行双重转义,以便转义字符 (\) 实际上会被发送到 redis。使用 " 它的问题更大,您必须在查询和 redis-cli 中对它进行转义,因此您将需要三个转义(两个以便将转义字符发送到 redis,一个在客户端)。它看起来像这样:

127.0.0.1:6379> FT.SEARCH Device "@ServerNode:{Node\\-US\\-01}"
1) (integer) 1
2) "obj:Device:1"
3) 1) Id
2) "1"
3) Name
4) "FoobarDevice"
5) SerialNumber
6) "RK01:\"12345678\""
7) ServerNode
8) "Node-US-01"
9) Status
10) "1"
11) Info
12) "this and that"
127.0.0.1:6379> FT.SEARCH Device "@SerialNumber:{RK01\\:\\\"12345678\\\"}"
1) (integer) 1
2) "obj:Device:1"
3) 1) Id
2) "1"
3) Name
4) "FoobarDevice"
5) SerialNumber
6) "RK01:\"12345678\""
7) ServerNode
8) "Node-US-01"
9) Status
10) "1"
11) Info
12) "this and that"

您可以在此处阅读有关 token 化和转义的更多信息:https://oss.redislabs.com/redisearch/Escaping/

关于redis - 使用 RediSearch 对实体进行简单的字符串和整数索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57051779/

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