我试图理解如何在Redisearch中严格使用“ begins with”(开始于)进行查询,并且不断获取“ contains”。
例如,如果我的字段具有诸如'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
答案 0 :(得分:1)
检查提供的RDB后,我发现在搜索英尺*时,您并没有感到不适。答复如下所示:/dot-com/plp/football/x/index.html。之所以会得到这些答复,是因为该URL已被标记化,并且'/'是标记化字符之一。如果您不希望对这些URL进行标记,则需要将其声明为TAGS而不是TEXT。这样,整个网址将按原样编制索引,当搜索foot *时,它不会出现在结果中。
有关TAGS的更多信息,请参见FT.CREATE文档:https://oss.redislabs.com/redisearch/Commands.html