FT.SEARCH

Available in:
Redis Stack / Search 1.0.0
Time complexity:
O(N)

Search the index with a textual query, returning either documents or just ids

Syntax

FT.SEARCH index query 
          [NOCONTENT] 
          [VERBATIM] [NOSTOPWORDS] 
          [WITHSCORES] 
          [WITHPAYLOADS] 
          [WITHSORTKEYS] 
          [ FILTER numeric_field min max [ FILTER numeric_field min max ...]] 
          [ GEOFILTER geo_field lon lat radius m | km | mi | ft [ GEOFILTER geo_field lon lat radius m | km | mi | ft ...]] 
          [ INKEYS count key [key ...]] [ INFIELDS count field [field ...]] 
          [ RETURN count identifier [AS property] [ identifier [AS property] ...]] 
          [ SUMMARIZE [ FIELDS count field [field ...]] [FRAGS num] [LEN fragsize] [SEPARATOR separator]] 
          [ HIGHLIGHT [ FIELDS count field [field ...]] [ TAGS open close]] 
          [SLOP slop] 
          [TIMEOUT timeout] 
          [INORDER] 
          [LANGUAGE language] 
          [EXPANDER expander] 
          [SCORER scorer] 
          [EXPLAINSCORE] 
          [PAYLOAD payload] 
          [ SORTBY sortby [ ASC | DESC]] 
          [ LIMIT offset num] 
          [ PARAMS nargs name value [ name value ...]] 
          [DIALECT dialect]

Examples

Required parameters

index

is index name. You must first create the index using FT.CREATE.

query

is text query to search. If it's more than a single word, put it in quotes. Refer to Query syntax for more details.

Optional parameters

NOCONTENT

returns the document ids and not the content. This is useful if RediSearch is only an index on an external document collection.

VERBATIM

does not try to use stemming for query expansion but searches the query terms verbatim.

WITHSCORES

also returns the relative internal score of each document. This can be used to merge results from multiple instances.

WITHPAYLOADS

retrieves optional document payloads. See FT.CREATE. The payloads follow the document id and, if WITHSCORES is set, the scores.

WITHSORTKEYS

returns the value of the sorting key, right after the id and score and/or payload, if requested. This is usually not needed, and exists for distributed search coordination purposes. This option is relevant only if used in conjunction with SORTBY.

FILTER numeric_attribute min max

limits results to those having numeric values ranging between min and max, if numeric_attribute is defined as a numeric attribute in FT.CREATE. min and max follow ZRANGE syntax, and can be -inf, +inf, and use ( for exclusive ranges. Multiple numeric filters for different attributes are supported in one query.

GEOFILTER {geo_attribute} {lon} {lat} {radius} m|km|mi|ft

filter the results to a given radius from lon and lat. Radius is given as a number and units. See GEORADIUS for more details.

INKEYS {num} {attribute} ...

limits the result to a given set of keys specified in the list. The first argument must be the length of the list and greater than zero. Non-existent keys are ignored, unless all the keys are non-existent.

INFIELDS {num} {attribute} ...

filters the results to those appearing only in specific attributes of the document, like title or URL. You must include num, which is the number of attributes you're filtering by. For example, if you request title and URL, then num is 2.

RETURN {num} {identifier} AS {property} ...

limits the attributes returned from the document. num is the number of attributes following the keyword. If num is 0, it acts like NOCONTENT. identifier is either an attribute name (for hashes and JSON) or a JSON Path expression (for JSON). property is an optional name used in the result. If not provided, the identifier is used in the result.

SUMMARIZE ...

returns only the sections of the attribute that contain the matched text. See Highlighting for more information.

HIGHLIGHT ...

formats occurrences of matched text. See Highlighting for more information.

SLOP {slop}

allows a maximum of N intervening number of unmatched offsets between phrase terms. In other words, the slop for exact phrases is 0.

INORDER

puts the query terms in the same order in the document as in the query, regardless of the offsets between them. Typically used in conjunction with SLOP.

LANGUAGE {language}

use a stemmer for the supplied language during search for query expansion. If querying documents in Chinese, set to chinese to properly tokenize the query terms. Defaults to English. If an unsupported language is sent, the command returns an error. See FT.CREATE for the list of languages.

EXPANDER {expander}

uses a custom query expander instead of the stemmer. See Extensions.

SCORER {scorer}

uses a custom scoring function you define. See Extensions.

EXPLAINSCORE

returns a textual description of how the scores were calculated. Using this options requires the WITHSCORES option.

PAYLOAD {payload}

adds an arbitrary, binary safe payload that is exposed to custom scoring functions. See Extensions.

SORTBY {attribute} [ASC|DESC]

orders the results by the value of this attribute. This applies to both text and numeric attributes. Attributes needed for SORTBY should be declared as SORTABLE in the index, in order to be available with very low latency. Note that this adds memory overhead.

LIMIT first num

limits the results to the offset and number of results given. Note that the offset is zero-indexed. The default is 0 10, which returns 10 items starting from the first result. You can use LIMIT 0 0 to count the number of documents in the result set without actually returning them.

TIMEOUT {milliseconds}

overrides the timeout parameter of the module.

PARAMS {nargs} {name} {value}

defines one or more value parameters. Each parameter has a name and a value.

You can reference parameters in the query by a $, followed by the parameter name, for example, $user. Each such reference in the search query to a parameter name is substituted by the corresponding parameter value. For example, with parameter definition PARAMS 4 lon 29.69465 lat 34.95126, the expression @loc:[$lon $lat 10 km] is evaluated to @loc:[29.69465 34.95126 10 km]. You cannot reference parameters in the query string where concrete values are not allowed, such as in field names, for example, @loc. To use PARAMS, set DIALECT to 2.

DIALECT {dialect_version}

selects the dialect version under which to execute the query. If not specified, the query will execute under the default dialect version set during module initial loading or via FT.CONFIG SET command.

Return

FT.SEARCH returns an array reply, where the first element is an integer reply of the total number of results, and then array reply pairs of document ids, and array replies of attribute/value pairs.

Notes:

  • If NOCONTENT is given, an array is returned where the first element is the total number of results, and the rest of the members are document ids.
  • If a hash expires after the query process starts, the hash is counted in the total number of results, but the key name and content return as null.

Complexity

FT.SEARCH complexity is O(n) for single word queries. n is the number of the results in the result set. Finding all the documents that have a specific term is O(1), however, a scan on all those documents is needed to load the documents data from redis hashes and return them.

The time complexity for more complex queries varies, but in general it's proportional to the number of words, the number of intersection points between them and the number of results in the result set.

Examples

Search for a term in every text attribute

Search for the term "wizard" in every TEXT attribute of an index containing book data.

127.0.0.1:6379> FT.SEARCH books-idx "wizard"
Search for a term in title attribute

Search for the term dogs in the title attribute.

127.0.0.1:6379> FT.SEARCH books-idx "@title:dogs"
Search for books from specific years

Search for books published in 2020 or 2021.

127.0.0.1:6379> FT.SEARCH books-idx "@published_at:[2020 2021]"
Search for a restaurant by distance from longitude/latitude

Search for Chinese restaurants within 5 kilometers of longitude -122.41, latitude 37.77 (San Francisco).

127.0.0.1:6379> FT.SEARCH restaurants-idx "chinese @location:[-122.41 37.77 5 km]"
Search for a book by terms but boost specific term

Search for the term dogs or cats in the title attribute, but give matches of dogs a higher relevance score (also known as boosting).

127.0.0.1:6379> FT.SEARCH books-idx "(@title:dogs | @title:cats) | (@title:dogs) => { $weight: 5.0; }"
Search for a book by a term and EXPLAINSCORE

Search for books with dogs in any TEXT attribute in the index and request an explanation of scoring for each result.

127.0.0.1:6379> FT.SEARCH books-idx "dogs" WITHSCORES EXPLAINSCORE
Search for a book by a term and TAG

Searching for books with space in the title that have science in the TAG attribute categories:

127.0.0.1:6379> FT.SEARCH books-idx "@title:space @categories:{science}"
Search for a book by a term but limit the number

Searching for books with Python in any TEXT attribute, returning ten results starting with the eleventh result in the entire result set (the offset parameter is zero-based), and returning only the title attribute for each result:

127.0.0.1:6379> FT.SEARCH books-idx "python" LIMIT 10 10 RETURN 1 title
Search for a book by a term and price

Search for books with Python in any TEXT attribute, returning the price stored in the original JSON document.

127.0.0.1:6379> FT.SEARCH books-idx "python" RETURN 3 $.book.price AS price
Search for a book by title and distance

Search for books with semantically similar title to Planet Earth. Return top 10 results sorted by distance.

127.0.0.1:6379> FT.SEARCH books-idx "*=>[KNN 10 @title_embedding $query_vec AS title_score]" PARAMS 2 query_vec <"Planet Earth" embedding BLOB> SORTBY title_score DIALECT 2

See also

FT.SEARCH | FT.AGGREGATE

History

  • Starting with Redis version 2.0.0: Deprecated WITHPAYLOADS and PAYLOAD arguments

Feedback

If you've found issues on this page, or have suggestions for improvement, please submit a request to merge or open an issue in the repository.