反斜杠本身的转义在 Redis 中表现得很奇怪。上下文是我需要对文档进行索引,但如果文档包含反斜杠,希望避免对反斜杠(转义分隔符)的影响。
1 我尝试对文本“login\\ Today”建立索引。根据我的理解,文本应该被标记为两个世界“登录\”和“今天”,因为反斜杠本身的转义空格将保持原样,从而分隔单词。
ft.create test_idx on hash prefix 1 “test:doc:” schema detail text hset test:doc:doc1 detail “login\\\\ today”
然而,当我搜索“今天”时,却什么也没返回。
ft.search test_idx “today”
如果我搜索“login\\today”,就会检索到文档。
ft.search test_idx “login\\\\today”
我很困惑,不知道为什么。
2 我还发现了其他东西。
127.0.0.1:6379> ft.explaincli test_idx "login\\\\\\\\today"
1) UNION {
2) login\today
3) +login\today(expanded)
4) }
我虽然应该搜索“login\today”,但中间的一些反斜杠被删除了。我正在使用 redis_version:6.2.11 和 search:2.6.7
如果有人能回答我的问题,我将不胜感激。
非常感谢。
了解 Redis 中反斜杠的行为,尤其是在 RediSearch 中的索引和搜索上下文中,确实可能很棘手,因为反斜杠在输入和处理过程中是如何处理的。以下是详细的细分,可帮助阐明您的场景中发生的情况:
1。使用反斜杠进行索引和搜索
索引“登录\今天”
当您使用以下方式索引文本“login\ Today”时:
hset test:doc:doc1 detail "login\\ today"
反斜杠 () 在许多编程环境中是一个特殊字符,通常用作转义字符。在 Redis CLI 和许多编程环境中,您需要转义反斜杠本身,这意味着您应该编写 \ 来表示单个 .
但是,您似乎正确地转义了反斜杠。如果空间保持原样,文本应标记为“登录”和“今天”。
但是由于反斜杠的处理方式,需要考虑一些细微差别:
搜索“今天”
当您搜索“今天”时:
ft.search test_idx "today"
它不会返回任何内容,因为如果反斜杠处理影响标记化,标记生成器可能无法将“今天”识别为单独的标记。
搜索“今天登录”
当您搜索“今天登录”时:
ft.search test_idx "login\\\\today"
由于 Redis CLI 解析,这涉及双重转义。每个反斜杠都需要转义,因此 \ 变为 \。搜索会检索文档,因为它与索引期间解释的标记相匹配。
2。查询解析说明
跑步时:
ft.explaincli test_idx "login\\\\\\\\today"
你看:
1) UNION {
2) login\today
3) +login\today(expanded)
4) }
此输出指示内部如何解析和执行查询。详细内容如下:
要记住的要点
转义反斜杠:始终考虑反斜杠需要被 逃脱了,并且需要在两个方面都考虑到这种加倍效应 索引和搜索。
标记化的细微差别:反斜杠的存在会影响文本的标记化方式。确保您的理解与 RediSearch 对这些字符的解释保持一致。
查询解释:解释命令显示如何解析和执行查询,揭示如何处理反斜杠。
建议
通过彻底了解这些方面,您可以更好地处理Redis和RediSearch中包含反斜杠的文本。