Exact Match in RedisSearch

Hello,

I am new in redisSearch module. I am trying to do exact match search using this command:

I need to get the fields which their values only developer. I used this command:

FT.SEARCH corpus “@name:(developer)”

However, I am getting all indices which has developer inside their values like:

  • Software developer
  • PHP developer

But I need to get the values which have developer alone without anything else.

Thanks a lot,
Mai

Hey @mai.abdelqader,

If you need an exact match on your data you should use a TAG field, tag fields are only tokenized by ‘,’ (and you can choose another char on index creation):

redis-16805.testbb5b94fa.cto.redislabs.com:16805> FT.CREATE idx SCHEMA t TAG
OK
redis-16805.testbb5b94fa.cto.redislabs.com:16805> ft.add idx doc1 1.0 FIELDS t "Software developer"
OK
redis-16805.testbb5b94fa.cto.redislabs.com:16805> ft.add idx doc2 1.0 FIELDS t "PHP developer"
OK
redis-16805.testbb5b94fa.cto.redislabs.com:16805> ft.add idx doc3 1.0 FIELDS t "developer"
OK
redis-16805.testbb5b94fa.cto.redislabs.com:16805> FT.SEARCH idx @t:{developer}
1) (integer) 1
2) "doc3"
3) 1) "t"
   2) "developer"
redis-16805.testbb5b94fa.cto.redislabs.com:16805> FT.SEARCH idx "@t:{Software developer}"
1) (integer) 1
2) "doc1"
3) 1) "t"
   2) "Software developer"

To read more about TAG fields: https://oss.redislabs.com/redisearch/master/Tags/

1 Like

+1 @meirsh

@mai.abdelqader I assume for this name field are you always going to perform exact match. in that case TAG would be right data type you can choose.

>> FT.CREATE roles SCHEMA id NUMERIC name TAG SORTABLE
"OK"

>> FT.ADD roles 1 1.0 FIELDS name "Software developer"
"OK"

>> FT.ADD roles 2 1.0 FIELDS name "Developer"
"OK"

>> FT.ADD roles 3 1.0 FIELDS name "PHP developer"
"OK"

>> FT.ADD roles 4 1.0 FIELDS name "Java developer"
"OK"

>> FT.SEARCH roles "@name:{developer}"
1) (integer) 1 2) "2" 3) 1) "name" 2) "Developer"

>> FT.SEARCH roles "@name:{Developer}"
1) (integer) 1 2) "2" 3) 1) "name" 2) "Developer"

>> FT.SEARCH roles "@name:{PHP}"
1) (integer) 0

>> FT.SEARCH roles "@name:{PHP developer}"
1) (integer) 1 2) "3" 3) 1) "name" 2) "PHP developer" 

Note here that:

  1. partial match will not be supported if use TAG
  2. its case insensitive

Thanks a lot. This is exactly what I was searching for.

1 Like