【问题标题】:Redisearch query with "begin with" instead of "contains"使用“begin with”而不是“contains”的 Redisearch 查询
【发布时间】:2019-05-19 16:45:20
【问题描述】:

我正在尝试了解如何在 Redisearch 中严格使用“开头”来执行查询,但我不断收到“包含”。

例如,如果我的字段具有 'football''myfootball''greenfootball' 等值,并且会提供搜索词像这样:

> FT.SEARCH myIdx @myfield:foot*

我只想获得 'football',但我不断获得包含该单词而不是以该单词开头的其他字段。

有没有办法避免这种情况?

我试图使用VERBATIM@myfield:^foot* 之类的东西,但什么也没有。

我使用 JRedisearch 作为客户端,但最终我不得不进入数据库并手动执行这些查询,以便弄清楚发生了什么。话虽如此,目前这可能与该客户有关吗?

谢谢

编辑 我的索引设置示例:

Client client = new Client(INDEX_NAME, url, PORT);
Schema sc = new Schema().addSortableTextField("url", 1.0); // using this field for query
client.dropIndex(true);
client.createIndex(sc, Client.IndexOptions.Default());
return client;

示例文档:

id: // random uuid
urlPath: myfootbal
application: web
market: Europe

【问题讨论】:

  • 您能否发布一个完整的示例(您存储的文档)?
  • @GuyKorland,已更新,希望没关系
  • 你还能添加一些文档示例吗?问题是 redisearch 不支持包含(仅前缀)。所以我不明白你是如何获得包含的。需要一个完整的示例来创建此问题以便能够提供帮助。
  • 我明白了,如果你表演:FT.SEARCH myIdx @urlPath:foot* 你要找回 myfootbal?
  • @MeirShpilraien,是的,这正是我的情况。抱歉耽搁了,我在 Spring I/O :)

标签: java redis redisearch


【解决方案1】:

在检查提供的 RDB 后,我发现在搜索 foot* 时您没有得到 myfootbal。回复如下所示:/dot-com/plp/football/x/index.html。您收到这些回复是因为此 url 已标记化,并且“/”是标记化字符之一。如果您不希望这些 url 被标记,您需要将它们声明为 TAGS 而不是 TEXT。这样,整个 url 将按原样编入索引,当搜索 foot* 时,它不会出现在结果中。

有关 TAGS 的更多信息,请参阅 FT.CREATE 文档:https://oss.redislabs.com/redisearch/Commands.html

【讨论】:

  • 我没有提到我在我的领域有/,对此感到抱歉。但是,文档在涉及标记化时没有提及正斜杠的任何内容。 oss.redislabs.com/redisearch/Escaping.html - 它指定这些字段:,.<>{}[]"':;!@#$%^&*()-+=~。至少我不清楚这是问题所在,并且正斜杠已被标记化。此外,通过使用标签,我失去了进行通配符搜索的好处(例如:/gts/foot* 等),这不是我想要的。
  • 你可以用TAGS做前缀,这样你就不会失去这个能力。
猜你喜欢
  • 2020-03-19
  • 2019-03-07
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多