FT.SEARCH
FT.SEARCH
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]
- Доступно в:
- Redis Stack / Поиск 1.0.0
- Временная сложность:
- O(N)
Ищет в индексе с текстовым запросом, возвращая либо документы, либо только идентификаторы
Обязательные аргументы
index
имя индекса. Сначала необходимо создать индекс, используя FT.CREATE.
query
текстовый запрос для поиска. Если запрос состоит из нескольких слов, заключите его в кавычки. Для получения дополнительных сведений обратитесь к синтаксису запроса.
Необязательные аргументы
NOCONTENT
возвращает идентификаторы документов, а не содержимое. Это полезно, если RediSearch используется только для индексирования внешней коллекции документов.
VERBATIM
не пытается использовать стемминг для расширения запроса, а ищет термины запроса дословно.
WITHSCORES
также возвращает относительный внутренний рейтинг каждого документа. Это может быть использовано для объединения результатов из нескольких экземпляров.
WITHPAYLOADS
получает необязательные данные платного документа. См. FT.CREATE. Данные платного документа следуют за идентификатором документа и, если WITHSCORES задано, за рейтингами.
WITHSORTKEYS
возвращает значение ключа сортировки сразу после идентификатора и рейтинга и/или данных платного документа, если они запрошены. Обычно это не требуется и используется для целей согласования распределенного поиска. Этот параметр релевантен только при использовании в сочетании с SORTBY.
FILTER numeric_attribute min max
ограничивает результаты документами, у которых числовые значения находятся в диапазоне между min и max, если числовой атрибут определен как числовой атрибут в FT.CREATE. min и max следуют синтаксису ZRANGE и могут быть -inf, +inf, и использовать ( для исключающих диапазонов. Поддерживаются несколько числовых фильтров для разных атрибутов в одном запросе.
GEOFILTER {geo_attribute} {lon} {lat} {radius} m|km|mi|ft
фильтрует результаты по заданному radius от lon до lat. Радиус задаётся числом и единицами измерения. Для получения дополнительных сведений см. GEORADIUS.
INKEYS {num} {attribute} ...
ограничивает результат заданным набором ключей, указанных в списке. Первый аргумент должен быть длиной списка и больше нуля. Несуществующие ключи игнорируются, если все ключи не существуют.
INFIELDS {num} {attribute} ...
фильтрует результаты по тем, которые встречаются только в определенных атрибутах документа, например, title или URL . Вы должны указать num, что является количеством атрибутов, по которым вы фильтруете. Например, если вы запрашиваете title и URL, то num равно 2.
RETURN {num} {identifier} AS {property} ...
ограничивает атрибуты, возвращаемые из документа. num — это количество атрибутов, следующих за ключевым словом. Если num равно 0, оно действует как NOCONTENT. identifier — это либо имя атрибута (для хешей и JSON), либо выражение JSON Path (для JSON). property — это необязательное имя, используемое в результате. Если оно не указано, в результате используется identifier.
SUMMARIZE ...
возвращает только части атрибута, содержащие соответствующий текст. Для получения дополнительной информации см. Выделение.
HIGHLIGHT ...
форматирует вхождения соответствующего текста. Для получения дополнительной информации см. Выделение.
SLOP {slop}
является числом промежуточных терминов, которые разрешается вставить между терминами запроса. Предположим, что вы ищете фразу hello world. Если некоторые термины встречаются между hello и world, то SLOP больше 0 позволяет соответствовать этим текстовым атрибутам. По умолчанию ограничение на SLOP отсутствует.
INORDER
требует, чтобы термины в документе имели тот же порядок, что и термины в запросе, независимо от расстояний между ними. Обычно используется в сочетании с SLOP По умолчанию false.
LANGUAGE {language}
использует стеммер для заданного языка при поиске для расширения запроса. Если вы осуществляете поиск по документам на китайском языке, задайте chinese для правильного токенизации терминов запроса. По умолчанию используется английский. Если используется неподдерживаемый язык, команда возвращает ошибку. Список языков см. в FT.CREATE.
EXPANDER {expander}
использует пользовательское расширение запроса вместо стеммера. См. Расширения.
SCORER {scorer}
использует пользовательскую функцию расчёта рейтингов, которую вы определяете. См. Расширения.
EXPLAINSCORE
возвращает текстовое описание того, как были рассчитаны рейтинги. Использование этого параметра требует WITHSCORES.
PAYLOAD {payload}
добавляет произвольные, бинарно-безопасные данные, которые доступны пользовательским функциям расчёта рейтингов. См. Расширения.
SORTBY {attribute} [ASC|DESC]
сортирует результаты по значению этого атрибута. Это относится как к текстовым, так и к числовым атрибутам. Атрибуты, необходимые для SORTBY должны быть объявлены как SORTABLE в индексе, чтобы быть доступными с очень низкой задержкой. Обратите внимание, что это увеличивает объём занимаемой памяти.
LIMIT first num
ограничивает результаты заданным смещением и количеством результатов. Обратите внимание, что смещение нулевое. По умолчанию 0 10, что возвращает 10 элементов, начиная с первого результата. Для подсчёта количества документов в наборе результатов без фактического их возвращения можно использовать LIMIT 0 0.
TIMEOUT {milliseconds}
переопределяет параметр таймаута модуля.
PARAMS {nargs} {name} {value}
определяет один или несколько параметров значений. Каждый параметр имеет имя и значение.
Вы можете ссылаться на параметры в query по $, за которым следует имя параметра, например, $user. Каждая такая ссылка в запросе поиска на имя параметра заменяется соответствующим значением параметра. Например, с определением параметра PARAMS 4 lon 29.69465 lat 34.95126, выражение @loc:[$lon $lat 10 km] вычисляется в @loc:[29.69465 34.95126 10 km] . Вы не можете ссылаться на параметры в строке запроса, где не разрешены конкретные значения, например, в именах полей, например, @loc Для использования PARAMS, установите DIALECT в 2 или больше 2.
DIALECT {dialect_version}
выбирает версию диалекта, в рамках которой будет выполняться запрос. Если не указано, запрос будет выполняться в рамках версии диалекта по умолчанию, установленной во время загрузки модуля или с помощью команды FT.CONFIG SET.
Возврат
FT.SEARCH возвращает массивный ответ, где первый элемент — это целочисленный ответ общего числа результатов, а затем — парные массивы ответов с идентификаторами документов и массивами ответов с парами атрибутов/значений.
- Если
NOCONTENTзадано, возвращается массив, где первый элемент — общее количество результатов, а остальные члены — идентификаторы документов. - Если хеш истекает после начала процесса запроса, хеш учитывается в общем количестве результатов, но имя ключа и содержимое возвращаются как null.
Возвращение нескольких значений
Когда индекс определён ON JSON, ответ для одного атрибута или одного JSONPath может вернуть несколько значений, когда JSONPath соответствует нескольким значениям или когда JSONPath соответствует массиву.
До RediSearch v2.6 возвращалось только первое из совпадающих значений. Начиная с RediSearch v2.6, возвращаются все значения, обернутые верхнеуровневым массивом.
Для поддержания обратной совместимости, по умолчанию RediSearch v2.6 возвращает только первое значение.
Чтобы вернуть все значения, используйте DIALECT 3 (или больше, если доступно).
DIALECT может быть указан как параметр в команде FT.SEARCH. Если он не указан, используется DEFAULT_DIALECT, который можно установить с помощью FT.CONFIG SET или передать в модуль redisearch при его загрузке.
Например, с помощью следующего документа и индекса:
127.0.0.1:6379> JSON.SET doc:1 $ '[{"arr": [1, 2, 3]}, {"val": "hello"}, {"val": "world"}]'
OK
127.0.0.1:6379> FT.CREATE idx ON JSON PREFIX 1 doc: SCHEMA $..arr AS arr NUMERIC $..val AS val TEXT
OK
Обратите внимание на различия в ответах с и без DIALECT 3:
127.0.0.1:6379> FT.SEARCH idx * RETURN 2 arr val
1) (integer) 1
2) "doc:1"
3) 1) "arr"
2) "[1,2,3]"
3) "val"
4) "hello"
127.0.0.1:6379> FT.SEARCH idx * RETURN 2 arr val DIALECT 3
1) (integer) 1
2) "doc:1"
3) 1) "arr"
2) "[[1,2,3]]"
3) "val"
4) "[\"hello\",\"world\"]"
Сложность
Сложность FT.SEARCH — O(n) для запросов с одним словом. n — это количество результатов в наборе результатов. Нахождение всех документов, содержащих определённый термин, имеет сложность O(1), однако для загрузки данных документов из хешей Redis и их возврата требуется сканирование всех этих документов.
Временная сложность для более сложных запросов варьируется, но, как правило, она пропорциональна числу слов, числу точек пересечения между ними и числу результатов в наборе результатов.
Примеры
Поиск термина во всех текстовых атрибутах
Поиск термина "волшебник" в каждом текстовом атрибуте индекса, содержащего данные о книгах.
127.0.0.1:6379> FT.SEARCH books-idx "wizard"Поиск по термину в атрибуте title
Ищите термин собаки в атрибуте title.
127.0.0.1:6379> FT.SEARCH books-idx "@title:dogs"Поиск книг по годам публикации
Ищите книги, опубликованные в 2020 или 2021 году.
127.0.0.1:6379> FT.SEARCH books-idx "@published_at:[2020 2021]"Поиск ресторана по расстоянию от долготы/широты
Ищите китайские рестораны в радиусе 5 километров от долготы -122.41, широты 37.77 (Сан-Франциско).
127.0.0.1:6379> FT.SEARCH restaurants-idx "chinese @location:[-122.41 37.77 5 km]"Поиск книги по терминам с повышением значимости определенного термина
Ищите термин собаки или кошки в атрибуте title, но отдавайте предпочтение совпадениям с собаками (также известное как повышение значимости).
127.0.0.1:6379> FT.SEARCH books-idx "(@title:dogs | @title:cats) | (@title:dogs) => { $weight: 5.0; }"Поиск книги по термину и EXPLAINSCORE
Ищите книги, содержащие термин собаки в любом атрибуте TEXT в индексе, и запросите объяснение оценки для каждого результата.
127.0.0.1:6379> FT.SEARCH books-idx "dogs" WITHSCORES EXPLAINSCOREПоиск книги по термину и TAG
Ищите книги с космосом в названии, которые имеют science в атрибуте TAG categories.
127.0.0.1:6379> FT.SEARCH books-idx "@title:space @categories:{science}"Поиск книги по термину, но с ограничением количества результатов
Ищите книги, содержащие Python в любом атрибуте TEXT, возвращая 10 результатов, начиная с 11-го результата во всем наборе результатов (параметр смещения нулевой), и возвращая только атрибут title для каждого результата.
127.0.0.1:6379> FT.SEARCH books-idx "python" LIMIT 10 10 RETURN 1 titleПоиск книги по термину и цене
Ищите книги, содержащие Python в любом атрибуте TEXT, возвращая цену, хранящуюся в исходном документе JSON.
127.0.0.1:6379> FT.SEARCH books-idx "python" RETURN 3 $.book.price AS priceПоиск книги по названию и расстоянию
Ищите книги с семантически похожими названиями на Планета Земля. Возвращайте 10 лучших результатов, отсортированных по расстоянию.
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Поиск фразы с использованием SLOP
Ищите фразу привет мир. Сначала создайте индекс.
127.0.0.1:6379> FT.CREATE memes SCHEMA phrase TEXT
OKДобавьте вариации фразы привет мир.
127.0.0.1:6379> HSET s1 phrase "hello world"
(integer) 1
127.0.0.1:6379> HSET s2 phrase "hello simple world"
(integer) 1
127.0.0.1:6379> HSET s3 phrase "hello somewhat less simple world"
(integer) 1
127.0.0.1:6379> HSET s4 phrase "hello complicated yet encouraging problem solving world"
(integer) 1
127.0.0.1:6379> HSET s5 phrase "hello complicated yet amazingly encouraging problem solving world"
(integer) 1Затем ищите фразу привет мир. Результат возвращает все документы, содержащие фразу.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello world)' NOCONTENT
1) (integer) 5
2) "s1"
3) "s2"
4) "s3"
5) "s4"
6) "s5"Теперь верните все документы, имеющие одну или меньше слов между привет и мир.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello world)' NOCONTENT SLOP 1
1) (integer) 2
2) "s1"
3) "s2"Теперь верните все документы с тремя или менее словами между привет и мир.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello world)' NOCONTENT SLOP 3
1) (integer) 3
2) "s1"
3) "s2"
4) "s3"s5 требуется более высокая SLOP для совпадения, SLOP 6 или выше, точно. Посмотрите, что произойдёт, если вы установите SLOP в 5.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello world)' NOCONTENT SLOP 5
1) (integer) 4
2) "s1"
3) "s2"
4) "s3"
5) "s4"Если вы добавите дополнительные термины (и стемминг), вы получите такие результаты.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello amazing world)' NOCONTENT
1) (integer) 1
2) "s5"127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello encouraged world)' NOCONTENT SLOP 5
1) (integer) 2
2) "s4"
3) "s5"127.0.0.1:6379> FT.SEARCH memes '@phrase:(hello encouraged world)' NOCONTENT SLOP 4
1) (integer) 1
2) "s4"Если вы поменяете местами термины, вы всё ещё можете получить правильную фразу.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(amazing hello world)' NOCONTENT
1) (integer) 1
2) "s5"Но, если вы используете INORDER, вы получите ноль результатов.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(amazing hello world)' NOCONTENT INORDER
1) (integer) 0Аналогично, если вы используете атрибут запроса $inorder установленный на true, s5 не будет получено.
127.0.0.1:6379> FT.SEARCH memes '@phrase:(amazing hello world)=>{$inorder: true;}' NOCONTENT
1) (integer) 0Подводя итог, аргумент INORDER или атрибут запроса $inorder требуют, чтобы термины запроса соответствовали терминам с похожим порядком.
См. также
Связанные темы
История
- Начиная с версии Redis 2.0.0: Устарели аргументы
WITHPAYLOADSиPAYLOAD
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/ft.search/