Запрос повторного поиска с «начать с» вместо «содержит» - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь понять, как выполнять запросы в 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

1 Ответ

1 голос
/ 19 мая 2019

После проверки RDB я вижу, что при поиске ноги * вы не получаете myfootbal. Ответы выглядят так: /dot-com/plp/football/x/index.html. Вы получаете эти ответы, потому что этот URL токенизирован, а '/' является одним из символов токенизации. Если вы не хотите, чтобы эти URL были токенизированы, вы должны объявить их как TAGS, а не как TEXT. Таким образом, весь URL будет проиндексирован как есть, а при поиске foot * он не будет отображаться в результатах.

Для получения дополнительной информации о TAGS см. Документацию FT.CREATE: https://oss.redislabs.com/redisearch/Commands.html

...