1

我试图了解如何在 Redisearch 中严格使用“开头”来执行查询,并且我不断得到“包含”。

例如,如果我的字段具有诸如'football''myfootball''greenfootball'之类的值,并且会提供如下搜索词:

> FT.SEARCH myIdx @myfield:foot*

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

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

我试图使用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
4

1 回答 1

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

于 2019-05-19T08:45:20.210 回答