diff --git a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx index 437e487757..1ab9a1e9c0 100644 --- a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx +++ b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.spec.tsx @@ -56,17 +56,29 @@ describe('SavedQueriesScreen', () => { // Check that preset queries are rendered for bikes index expect( - screen.getByText('Search for "Nord" bikes ordered by price'), + screen.getByText("Run a vector search for 'Comfortable commuter bike'"), ).toBeInTheDocument() expect( - screen.getByText('Find road alloy bikes under 20kg'), + screen.getByText( + "Run a vector search for 'Commuter bike for people over 60'", + ), + ).toBeInTheDocument() + expect( + screen.getByText( + "Run a vector search for 'Female specific mountain bike'", + ), + ).toBeInTheDocument() + expect( + screen.getByText( + "Run a vector search for 'Female specific mountain bike' for bikes type 'Mountain bikes' and with price between $3500 and $3500", + ), ).toBeInTheDocument() }) it('should render insert buttons for each query', () => { renderComponent() const insertButtons = screen.getAllByText('Insert') - expect(insertButtons).toHaveLength(2) + expect(insertButtons).toHaveLength(4) }) it('should select the first index by default', () => { @@ -93,7 +105,9 @@ describe('SavedQueriesScreen', () => { const firstInsertButton = screen.getAllByText('Insert')[0] fireEvent.click(firstInsertButton) expect(mockOnQueryInsert).toHaveBeenCalledWith( - 'FT.SEARCH idx:bikes_vss "@brand:Nord" SORTBY price ASC', + expect.stringContaining( + 'FT.SEARCH idx:bikes_vss \"*=>[KNN 3 @description_embeddings $my_blob AS score ]\" RETURN 4 score brand type description PARAMS 2 my_blob \"\\xecNN<\\xec\\xc78=\\`', + ), ) }) @@ -102,7 +116,9 @@ describe('SavedQueriesScreen', () => { const secondInsertButton = screen.getAllByText('Insert')[1] fireEvent.click(secondInsertButton) expect(mockOnQueryInsert).toHaveBeenCalledWith( - 'FT.SEARCH idx:bikes_vss "@material:{alloy} @weight:[0 20]"', + expect.stringContaining( + 'FT.SEARCH idx:bikes_vss \"*=>[KNN 3 @description_embeddings $my_blob AS score ]\" PARAMS 2 my_blob \"A=\\xe1\\xbb\\x8a\\xad\\x9b<&7R', + ), ) }) diff --git a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.tsx b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.tsx index 24f07db04f..70efdeb292 100644 --- a/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.tsx +++ b/redisinsight/ui/src/pages/vector-search/saved-queries/SavedQueriesScreen.tsx @@ -1,5 +1,3 @@ -// This is because of the long vec value in the data -/* eslint-disable max-len */ import React, { useState, useMemo, useEffect } from 'react' import { Title } from 'uiSrc/components/base/text' @@ -25,64 +23,18 @@ import NoDataMessage from '../components/no-data-message/NoDataMessage' import { QueryCard } from './QueryCard' import { IndexSelect } from './IndexSelect' import { NoDataMessageKeys } from '../components/no-data-message/data' +import { savedQueries } from './saved-queries' const mockSavedIndexes: SavedIndex[] = [ { value: PresetDataType.BIKES, tags: [FieldTypes.TAG, FieldTypes.TEXT, FieldTypes.VECTOR], - queries: [ - { - label: 'Search for "Nord" bikes ordered by price', - value: 'FT.SEARCH idx:bikes_vss "@brand:Nord" SORTBY price ASC', - }, - { - label: 'Find road alloy bikes under 20kg', - value: 'FT.SEARCH idx:bikes_vss "@material:{alloy} @weight:[0 20]"', - }, - ], + queries: savedQueries[PresetDataType.BIKES], }, { value: PresetDataType.MOVIES, tags: [FieldTypes.TAG, FieldTypes.TEXT, FieldTypes.VECTOR], - queries: [ - { - label: 'I want a fun animated movie about toys and friendship', - value: - 'FT.SEARCH idx:movies_vss "*=>[KNN 3 @embedding $vec AS score]" ' + - `PARAMS 2 vec ${String.raw`"\x9a\x99\x19\x3f\xcd\xcc\xcc\x3d\x9a\x99\x4c\x3f\x9a\x99\x33\x3e\x9a\x99\x33\x3f\xcd\xcc\x66\x3e\xcd\xcc\xcc\x3d\xcd\xcc\x4c\x3e"`} ` + - 'SORTBY score ' + - 'RETURN 3 title plot score ' + - 'DIALECT 2', - }, - { - label: 'A feel-good film about music and students', - value: - 'FT.SEARCH idx:movies_vss "@genres:{Music} =>[KNN 5 @embedding $vec AS score]" ' + - `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + - 'SORTBY score ' + - 'RETURN 3 title genres score ' + - 'DIALECT 2', - }, - { - label: 'Find classic musical rebellion films from the 90s', - value: - 'FT.SEARCH idx:movies_vss "(@genres:{Music} @year:[1970 1979]) =>[KNN 5 @embedding $vec AS score]" ' + - `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + - 'SORTBY score ' + - 'RETURN 4 title year genres score ' + - 'DIALECT 2', - }, - { - label: - 'You like Animated and Sci-Fi movies. Personalize results by filtering the vector search', - value: - `FT.SEARCH idx:movies_vss '@genres:{"Animated"|"Sci-Fi"} =>[KNN 5 @embedding $vec AS score]' ` + - `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + - 'SORTBY score ' + - 'RETURN 3 title genres score ' + - 'DIALECT 2', - }, - ], + queries: savedQueries[PresetDataType.MOVIES], }, ] diff --git a/redisinsight/ui/src/pages/vector-search/saved-queries/saved-queries.tsx b/redisinsight/ui/src/pages/vector-search/saved-queries/saved-queries.tsx new file mode 100644 index 0000000000..a5260deace --- /dev/null +++ b/redisinsight/ui/src/pages/vector-search/saved-queries/saved-queries.tsx @@ -0,0 +1,87 @@ +/* eslint-disable max-len */ +import { PresetDataType } from '../create-index/types' + +export const savedQueries = { + [PresetDataType.BIKES]: [ + { + label: "Run a vector search for 'Comfortable commuter bike'", + value: + 'FT.SEARCH idx:bikes_vss ' + + '"*=>[KNN 3 @description_embeddings $my_blob AS score ]" ' + + 'RETURN 4 score brand type description ' + + `PARAMS 2 my_blob ${String.raw`"\xecNN<\xec\xc78=\`\xbd\x87\xbc\xd0\xad\xdc<\xb9\x8fn\xbd\xc81Q<\xcc\x0c\x03=\x11\x9a\x96\xbd\xf0\x15\x9c\xc8d;\x87f:\xbc<\x0e\xb5<\x9a\x8eL=\xa1\x90\xcbcJ=wu\r=@W\xa5:\x96a\xcc<\n.\xdf\xbaI\xad\x0b\xbc\x04\x1f\x8c\xbdHh\xc8\xbd\xfd\xd9#\xba65\x90\xba2\x90\xc7;\xf9;X\xbd\xb19\x1e<\x8c\xc8\x02\xbd\x19\x17\xa4\xbdIV\xbe\xbc\x1bR\x01=l\xa1\xc7\xbc;* =(\x08a<2\xa1s\xbc\xd1\xa5\xbe<\x84e\xbb\xbc\xf1\xe2\xc8=\xc7\xd0I\xbd_\x9ft\xbc\xc6J\xe7<\xc8X\x84=\xa4(\x08=\xf8\x98\x08\xbd\x08\xf1\x07<\xd8\xce\xda\xbca\xee3\xbc\xbd1\xea;\xd4i\x96=\x99\xfa\x8d\xbcI\x1e\x19\xbd\xd7S\x81\xbb\x16\xfd=<\x00n1\xbd\xc2\xa6\xd3;\x1e\x12\x11<\x10X\x86;\x87\xfd\xb5P\xd8\xbb\xa5/T=\x98K6=\xdc\xb8W<\xc9\x1a\xba\xbc3\x15\x07<\xbf\x97\x85\xbd\xf5\"\xcb\xbcB\xbe^<\x8c\x17\x7f<\x98\xee\xc8<\xc8\xa2\xcc<\x0e\x8bl*=\x93*\x1c=\xe4|\xa2\xbcHE\x1f=\x9d\xf2=;\xa7iM;\x15\xa0\"\xbd\x81\x1a\x84\xbdZY\x9b\xbc4z\x9c\xbcs\xaa8\xbd]\xdb\x0b=\xa9S\x80\xbcx\x81U\xbd\x01~\x98\xbc\x9e\xa2\x88\xbc\xc9\xb3t=Z)9=|\xc2u<\xaaE\x9b=\x8c\xd8^<\xba\x8d\xb2=\x98\xb1\x84\xbc\xf9\x93J<\xba\x93#\xbd\x9dX\n\xbdz\xe6G\xbd\xc5\xa5\xa2\xbd\xec\xf1\xb1<-9L=\xbe\x86K=\xb6\x91\x1a:z(\xa2;\xd6\x16?<\xcd\"&\xbd:\x05\xb9<\xa1\xf13\xbd\x10\x9f\xc4\xba\t\x1c\x85\xbd<=a\xbaCg\x85\xbc\xe6\x85\xe1;\x11\xc2\x8b\xbdu\xaf\xde:\xe2\x14\x84\xbb\xc7\x0b\x99\xbc\xde\x03\x1e\xbd\xbaO\xdf<\xa7\x9dl\xbc\x1e*=\xbd\xdc\xc8\x1f\xbc\\\x16^;\x97\x87K\xbd\x9f\x8e\x9a\xbc\xbfH\t\xbd\xf1+(=\xeeF\x16=u\xfevA\xbd\x05,)[KNN 3 @description_embeddings $my_blob AS score ]" ' + + `PARAMS 2 my_blob ${String.raw`"A=\xe1\xbb\x8a\xad\x9b<&7R\xbd=!\xaf\xbbN\x0b|\xbd\x1c\xaf\xaf<@\x96\xa3;\x7fN8\xbd\xf8\x8d\x19=&:\x94\xbc\xb1\x19\xbe<\xef\x8e\xe5;\xac\xc2\x93\xbc\xe1\xbd\x9c\xbc\xc1\xf1)=\xcfE\x85;\x8aq\xae:z3\xb1;\x95\xf9\xf4<\xa7\xc6\x8f\xbc\xc6\xc1\xc3<-\x02\xdd\xbc\xd3\x16\xe5<\x06\`\xd7<\x1eB\xc4\xba\xd4D\xba;O\xb2+=\xff\x83N=|zy;\xdeL\x01=&\xf1\x9f\xbc\xcc\x02\xe0\xbc\xc8\"\xb4\xbc\xcf\xe3V\xbc\x9e\x03\xef:vJ\x13\xbd]\xc2F=\xed\xa8\xaf\xbb\xd8?\xc4\xbc\x06\x01\x05=\x84\x83P=\x0bT,<\x0c\x9c\x1d\x0b=\xae1>=|\x8f\x81;\xac\xdc\xbc<3k\xe6\xbcU\xdd\xcb\xbcs\xf4\xa3\xbd\xc7\x06\x1c\xbd\xa8\xf4m\xbc\x02\x92R;\xda\xc0\x85\xbb\xee\x04\x19\xbd\xfd\x97F\xbcD\x03\xc6;YM\xc2\xbd\x82\xd0b<\xcdt\x15=\xde\x8az.\xe3\xba\xf5\xa6(=n\xa7,\xbd%\xfb\xed;\xaf\x82n\xbd\xff\xeb\xd5\xbc\x19\x0f\xec;\xbe\xbb\xad=ex\xcd<\x8fS\xa3\x15=Ij\xee\xbc\xca\x8e\x1e\xbd\x87m\xc4<~\"\x1d\xbc\xc9m\x0b\xbc\x07\xa4\x18\xbdqg\xb4=\xa8\xcb\xf1\xbcn_\x03=\xf3\xb3\x07\xbd\xb2\xea\x9e\xbcm\xe1/;\xc0F\x8d\xbd\x04\xca\xaf<\x10\x98\x8e\xbdc\xe4\xb2\xbb\xd5K;;\xc3\x8c\x94=\xfe\xa0\x13&\x88=@\xf9\xd3\xbd\x94G\x1c=\xca\xf0&\xbd\xd6\x97\xfc\xbb\xbf\x80\xc9\xbc\xeek\xef<\xc6\x96\x94\xbc\x0b\x8a\x01=W\x81i<\xfdJy=OFo=\xad[]<\x9b\x9bA\xbd\xa3N\xae<\xcb\x88\x15=l\x11k\xba\xbe,\x91\xbc\xaf\xff%\xbcM\xe0\xdel=J\xaa\x0e=\xef\x16\r=\xa9xX\xb9\xb8\xac\xdf\xbc\xe5J\x02\xbd\xa7_\x8a=:\xd8/=W8(\xbd\x0c\x9a\x93\xbd\xbd~\x8d\xba&\n\`=\x13\x1e&<\xe3t\xb3\x04\x91\xbd\x921]\xbd\x8f6H< \x0c\x8e\xbd\x80\xd0\xc2\xbc\x8ewC\xbd\xd5\xbf\xd0\x82<\xbf^\xc2\xbb\xed5b;\xd4\x18\`\xbaQ\xe6E<,\x13\xb9\xbb\x7f\xa2\xbb<(\t\xad=\xc4\x00\xba<;\xb3G=4\xd5\xc7\xbcV\xean\xbc\x05\`T=\x00\td<\xcc\xe8\xd0<9\xdc\xdc\xbc\xff\x9f \x04=\x81\x84=\xbd\xff_\x8b<\xc4\x9d\x06<|\xf5\xc4\xbb\x8ey\xcc\xbdU}a;H\xbe\xe8\xbb\xf2\x02\xb2;\xd7L\x13\xb9\xafb0<[Y\x8e<\xa8\xf2\x8f\xbbl\xd8\xee\xd9l\xbc\xcf\x00\xfe:*J\xd0;\x9e\x0en\xbcH\xdee=S$9\xce\xa9\xbb\x81Mr\xbd\x90b\n\xbd\x8d\xbf\xaf\xbd\x9c\xfb\xc5<\x99\xce\x18=\\\xe9\xd9\xbb\xa4\xab\x87\xbcs\x8b\xa0<\xdem[<\xf2\xac\x92\xbcZ,*=Wa2\xbc\xfeD\x83\xbb_\x85M\xbd\xfbi\xca<\t!\xd5\xbb\xb1\x02\xee<\x05\x13\x8c;\"\x8e.\xbd\xd5s\x08[KNN 3 @description_embeddings $my_blob AS score ]" ' + + `PARAMS 2 my_blob ${String.raw`"\xf5\x1e\xaf:7\xd2\x03=\x90\x07\xd9\xbc_\xdf\x93=\x13U\xb7<2\xf7\x14\xbc\xd6q\x1a=^\x8d\xa8<\xe5\x9bR=\x8c\xc7\xd2<\x96\xd9\x0c\xbb\x9b/8\xbd\xbe\x14\x94=\x93\x05\x8e\xbck\x02V=\t\x1a<<\x1a\xff\xe5\xbb4F\xbe;\x10\x81\x9b=\xb6\xa0\xcc\xbd\xaa\xe9\xfd\xbb\x8b\x02\xde<\xcc\x96>\xbd!\xc9G<\xe5H\x92\x80es=\xecDN\xbdm\xb9i\xbd\x8f\xdd\x85\xbc)|\x06=\xf7\x13l\xbd\xdc\x98\x90\xbd\x86MQ\xbdV\xc5\xbe<\xc7\x0cB\xbb\xec#\x90<\xdf&\xe0\xbc) \xac:/\xff\x8a\xdf\x89=\xa2\xb5}<\xf2\x16\x85=\xc6P\x1e\xbc\x17!\x92<\xa5m\xbd6<\x1e(4\xbc|\x8b\xe2\xbbp\xea\xca\xbd\xe7\x999;J\xc2b\xbb\x97\xf92\xbb\x9d/J=n\x81\xce\xba\xd9\x12/=\xaf\xb6\x8d\xbd\xfd\xbe\"\xbdV\x1d\xef<\xb9\xaaO<\xf0\`\x81\xbdi\xdc\x12\xbb\xc3\xbf\x91<\xc7\xeb3\xbckr\xa0=\xee\xec\xcd:\xf3\x93\x80<\x96\na;A\x8a\xdc;\x10\xdb\xb1<\xbat\xb5\xbb\x1e\xbbM<\x1f)\x0e\xbc\x15\xfa\x1d\xbb\xd3\`\xe8<\xf6\xc1)=\xd8\xd7F\xbdl}+=\x92\x80X<\xa7\xbc\x8f<\x1e$\x14\xbc\x8a\x1b\xbc<\xec\x1e\xda\xbc\xa2\xac\x91\xbc\x84\xcf\x02=\`\x87\xf5<\xeb=\xde\xbc>\xe5@\xbdn\x90B;\x92\xd9\xd0\xbc\x1fn\xfd<\x86\xde\r=\x80^v<\xb0\x10\xfc<\x16T\xa0<\xa1gh\xbdf\x1c\x04i\n\xbdZ\x93\xf5<]\x1e\x9b;dme\xbc}B\xb8<\x03~\xe7<\xf0\xa5z\xbc\xab\xe5\x8f:\x0b\x98\xd2\xbc\x801\xf1<)\x83\xd1\xbccN\xe2=\x9a\x11\xbc<\x1c\xbe\xd9\xbc\x98\x0f\xf6< \xc9\x15=&\xbe\xdd\xbc\x1c0\t\xbd\xb5\x8e\x92\xbdXa\x8e\xba>D.\xbdNBE\xbd\xbdq\xbc;\x8a\x03\x86\xbc\xe6\xa2\x12\xbd\xd9\\\x15\xbd\x83\xca\xd4\xbc\x91\rV\xa9\xbcTB\xe1<\xb6\xd7\xb4<\xb9\xb9b=\\\xa4l\xbc\xeb\xea:=\x98\x84\xed;*\x01\xef\xbc\xf5$a;\xaa\xe8+=\xf1\xa0 =\xd8\x8b\x03\xbd\x96\xd5#=g\x1f\x91\xbd\xc4\x02\x05\xbc\x94\xd4\x92\xbdS^\x92\xbcs\xe6\xe4J;L\xd8\xd5\xbc\xda$0\xbc\x15#H\xbd\xd9\x7fI=V5\x00;\xd4\x80J;\x86R\x9c\xbdI\xb6\xa6:P\xb8\xe2\xbc\x95tN\xbd\x0f\x19\x85=\xa8\xa4\x86=^\x10\x81<\x9fO\r=]\x01\x1c=\x0f\x1d\x02\xbd&)\xe4\xbc\xfb\xfc\x02=\xec\x11\xdb<8\x83d\xbc\x8dFC\xbd\xfd0\`\xbd\"*\x8d;\xd0\tm\xbc\xac\x0b\x7f\xbdn\xf3\xd3\xbc\xad1\x03\xbb|M\x98\xbcZq\x16\xbd/\xd3\x97<(;\x0c\xbd\n\xff0=\x93\xb7\xb2\xbc\x8f\x90\xb8;\x92(\x98\xbc\xf3\x1f\xe7<9=\x13\xbcQ\x83\x8d\xbdF\xf1e<\xb2\xc6V=\xbdR};\xbd\x12\xb3\xbcu\x0b\x99=\x82\xd4\xbf\xbc\xcd\xf3\xf0<\xdd\x8a\xc7;\x02\xab\x8e\xbb\xb3GO=\xb280=\x8bw\x15\xbd\xa8\xf7<\xbc\x16v\x1d\xbdX\x99\xbb\xbc\xa9K\x03=\x9dh.\xbd[U\x92<\xd3\xe1\xab\xbb\xc1W\xb2:\x0fl\r\t\x17\x80\xb6\xbdK\xe7\n\xbdl\xd0\xb9<\x83x\xd5\xba\xd9\xb2 \xbcm\xbf\xcf\xbc\xe5,@\xbcL\xad\x18=\x1e\xe9\n\xbc\xed\xbc\xa4<\xa7KS\xbb\xa5\xe3O=\xf8*X;\x0e\x9b\x95=\xb72\x84\xbc\xf9\xff\\<\xf1\xc5\x93\xbaCk>\xbdAw\xe0<\xa2\xd6\xe3<\xde\xe0\x86=~}\x81=\xbe~u\xbdH\xcb6\xbd\x12\x9f2=\xc6\xf16=a^\xd3\xbc\xed\x04\x809\xe7\x8f\x07<\xb0\x9fW\xbb<\xf3\x16\xbd\x9a\x98\xfc<\xf8\xaf\xe1\xbc\xee\xb6!\xbd\xda\xeb\x96\xbcn\"\x7f<\xf8j\x8c\xc29j\x9fc=L\xb5\x00\xbbI\x90\xcb\xbc\xfdi\x81<\xbbx\x02\xbc\xfb\x0f\xa1\xbb\x13\xdf\x97\xbc\xa2t\x8f\xbc\x99jS\xbd\xdf\xb6\xbf[KNN 3 @description_embeddings $my_blob AS score ]" ' + + `PARAMS 2 my_blob ${String.raw`"\xf5\x1e\xaf:7\xd2\x03=\x90\x07\xd9\xbc_\xdf\x93=\x13U\xb7<2\xf7\x14\xbc\xd6q\x1a=^\x8d\xa8<\xe5\x9bR=\x8c\xc7\xd2<\x96\xd9\x0c\xbb\x9b/8\xbd\xbe\x14\x94=\x93\x05\x8e\xbck\x02V=\t\x1a<<\x1a\xff\xe5\xbb4F\xbe;\x10\x81\x9b=\xb6\xa0\xcc\xbd\xaa\xe9\xfd\xbb\x8b\x02\xde<\xcc\x96>\xbd!\xc9G<\xe5H\x92\x80es=\xecDN\xbdm\xb9i\xbd\x8f\xdd\x85\xbc)|\x06=\xf7\x13l\xbd\xdc\x98\x90\xbd\x86MQ\xbdV\xc5\xbe<\xc7\x0cB\xbb\xec#\x90<\xdf&\xe0\xbc) \xac:/\xff\x8a\xdf\x89=\xa2\xb5}<\xf2\x16\x85=\xc6P\x1e\xbc\x17!\x92<\xa5m\xbd6<\x1e(4\xbc|\x8b\xe2\xbbp\xea\xca\xbd\xe7\x999;J\xc2b\xbb\x97\xf92\xbb\x9d/J=n\x81\xce\xba\xd9\x12/=\xaf\xb6\x8d\xbd\xfd\xbe\"\xbdV\x1d\xef<\xb9\xaaO<\xf0\`\x81\xbdi\xdc\x12\xbb\xc3\xbf\x91<\xc7\xeb3\xbckr\xa0=\xee\xec\xcd:\xf3\x93\x80<\x96\na;A\x8a\xdc;\x10\xdb\xb1<\xbat\xb5\xbb\x1e\xbbM<\x1f)\x0e\xbc\x15\xfa\x1d\xbb\xd3\`\xe8<\xf6\xc1)=\xd8\xd7F\xbdl}+=\x92\x80X<\xa7\xbc\x8f<\x1e$\x14\xbc\x8a\x1b\xbc<\xec\x1e\xda\xbc\xa2\xac\x91\xbc\x84\xcf\x02=\`\x87\xf5<\xeb=\xde\xbc>\xe5@\xbdn\x90B;\x92\xd9\xd0\xbc\x1fn\xfd<\x86\xde\r=\x80^v<\xb0\x10\xfc<\x16T\xa0<\xa1gh\xbdf\x1c\x04i\n\xbdZ\x93\xf5<]\x1e\x9b;dme\xbc}B\xb8<\x03~\xe7<\xf0\xa5z\xbc\xab\xe5\x8f:\x0b\x98\xd2\xbc\x801\xf1<)\x83\xd1\xbccN\xe2=\x9a\x11\xbc<\x1c\xbe\xd9\xbc\x98\x0f\xf6< \xc9\x15=&\xbe\xdd\xbc\x1c0\t\xbd\xb5\x8e\x92\xbdXa\x8e\xba>D.\xbdNBE\xbd\xbdq\xbc;\x8a\x03\x86\xbc\xe6\xa2\x12\xbd\xd9\\\x15\xbd\x83\xca\xd4\xbc\x91\rV\xa9\xbcTB\xe1<\xb6\xd7\xb4<\xb9\xb9b=\\\xa4l\xbc\xeb\xea:=\x98\x84\xed;*\x01\xef\xbc\xf5$a;\xaa\xe8+=\xf1\xa0 =\xd8\x8b\x03\xbd\x96\xd5#=g\x1f\x91\xbd\xc4\x02\x05\xbc\x94\xd4\x92\xbdS^\x92\xbcs\xe6\xe4J;L\xd8\xd5\xbc\xda$0\xbc\x15#H\xbd\xd9\x7fI=V5\x00;\xd4\x80J;\x86R\x9c\xbdI\xb6\xa6:P\xb8\xe2\xbc\x95tN\xbd\x0f\x19\x85=\xa8\xa4\x86=^\x10\x81<\x9fO\r=]\x01\x1c=\x0f\x1d\x02\xbd&)\xe4\xbc\xfb\xfc\x02=\xec\x11\xdb<8\x83d\xbc\x8dFC\xbd\xfd0\`\xbd\"*\x8d;\xd0\tm\xbc\xac\x0b\x7f\xbdn\xf3\xd3\xbc\xad1\x03\xbb|M\x98\xbcZq\x16\xbd/\xd3\x97<(;\x0c\xbd\n\xff0=\x93\xb7\xb2\xbc\x8f\x90\xb8;\x92(\x98\xbc\xf3\x1f\xe7<9=\x13\xbcQ\x83\x8d\xbdF\xf1e<\xb2\xc6V=\xbdR};\xbd\x12\xb3\xbcu\x0b\x99=\x82\xd4\xbf\xbc\xcd\xf3\xf0<\xdd\x8a\xc7;\x02\xab\x8e\xbb\xb3GO=\xb280=\x8bw\x15\xbd\xa8\xf7<\xbc\x16v\x1d\xbdX\x99\xbb\xbc\xa9K\x03=\x9dh.\xbd[U\x92<\xd3\xe1\xab\xbb\xc1W\xb2:\x0fl\r\t\x17\x80\xb6\xbdK\xe7\n\xbdl\xd0\xb9<\x83x\xd5\xba\xd9\xb2 \xbcm\xbf\xcf\xbc\xe5,@\xbcL\xad\x18=\x1e\xe9\n\xbc\xed\xbc\xa4<\xa7KS\xbb\xa5\xe3O=\xf8*X;\x0e\x9b\x95=\xb72\x84\xbc\xf9\xff\\<\xf1\xc5\x93\xbaCk>\xbdAw\xe0<\xa2\xd6\xe3<\xde\xe0\x86=~}\x81=\xbe~u\xbdH\xcb6\xbd\x12\x9f2=\xc6\xf16=a^\xd3\xbc\xed\x04\x809\xe7\x8f\x07<\xb0\x9fW\xbb<\xf3\x16\xbd\x9a\x98\xfc<\xf8\xaf\xe1\xbc\xee\xb6!\xbd\xda\xeb\x96\xbcn\"\x7f<\xf8j\x8c\xc29j\x9fc=L\xb5\x00\xbbI\x90\xcb\xbc\xfdi\x81<\xbbx\x02\xbc\xfb\x0f\xa1\xbb\x13\xdf\x97\xbc\xa2t\x8f\xbc\x99jS\xbd\xdf\xb6\xbf[KNN 3 @embedding $vec AS score]" ' + + `PARAMS 2 vec ${String.raw`"\x9a\x99\x19\x3f\xcd\xcc\xcc\x3d\x9a\x99\x4c\x3f\x9a\x99\x33\x3e\x9a\x99\x33\x3f\xcd\xcc\x66\x3e\xcd\xcc\xcc\x3d\xcd\xcc\x4c\x3e"`} ` + + 'SORTBY score ' + + 'RETURN 3 title plot score ' + + 'DIALECT 2', + }, + { + label: 'A feel-good film about music and students', + value: + 'FT.SEARCH idx:movies_vss "@genres:{Music} =>[KNN 5 @embedding $vec AS score]" ' + + `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + + 'SORTBY score ' + + 'RETURN 3 title genres score ' + + 'DIALECT 2', + }, + { + label: 'Find classic musical rebellion films from the 90s', + value: + 'FT.SEARCH idx:movies_vss "(@genres:{Music} @year:[1970 1979]) =>[KNN 5 @embedding $vec AS score]" ' + + `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + + 'SORTBY score ' + + 'RETURN 4 title year genres score ' + + 'DIALECT 2', + }, + { + label: + 'You like Animated and Sci-Fi movies. Personalize results by filtering the vector search', + value: + `FT.SEARCH idx:movies_vss '@genres:{"Animated"|"Sci-Fi"} =>[KNN 5 @embedding $vec AS score]' ` + + `PARAMS 2 vec ${String.raw`"\x9a\x99\x1d\x3e\xcd\xcc\x4c\xbd\x9a\x99\x99\x3e\x9a\x99\x19\x3e\x9a\x99\x19\xbe\x9a\x99\x1d\x3e\xcd\xcc\x0c\x3e\x9a\x99\xf1\xbc"`} ` + + 'SORTBY score ' + + 'RETURN 3 title genres score ' + + 'DIALECT 2', + }, + ], +}