Node Master
مدت زیادی هست که #Redis Stack منتشر شده ولی هنوز خیلی ها به Redis به چشم یک دیتابیس Key-Value ساده نگاه میکنند و از 90 درصد قابلیت هاش استفاده نمیکنند. پیشنهاد میکنم داکیومنت مربوط بهش رو حتما بخونیدتا تمام ویژگی هایی رو که داره ببینید. دوتا از ویژگی های خوبی…
در پست قبلی درمورد #Redis JSON برای ذخیره کردن Document ها و Query های مربوط به این بخش آشنا شدیم. امروز نگاهی به Redis Search میندازیم و ترکیبش رو با Redis JSON برسی میکنیم.
اولین نکته این که شما توانایی index کردن HASH ها و JSON ها رو دارید. یعنی اگر پروژتون الان روی HASH هست بدون هیچ دردسری میتونید از Query های Redis Search استفاده کنید. برای پست امروز با Redis JSON کار میکنیم باتوجه به این که مطالعه کوچیکی درموردشون داشتیم. اولین کاری که میکنیم #Redis رو با دیتا فیک Seed میکنیم.
درمورد کار کردن با JSON در پست قبلی توضیح دادیم. مرحله بعدی این هست که Index و Schema مناسب برای این دیتا ایجاد کنیم که بتونیم Query بزنیم.
به FT.CREATE ما میتونیم ایندکس جدید ایجاد کنیم. این کامند بسیار آپشن های زیادی داره و پیشنهاد میکنم حتما داکیومنت مربوط بهش رو بخونید به عنوان مثال میتونید بعضی از Field ها که نیاز ندارید داخل Index قرار ندین ولی توی Schema شما وجود داشته باشه. برای امروز ما سعی میکنیم تا حد ممکن مثال رو ساده نگه داریم.
- بخش اول یعنی idx:user اسم ایندکس یا به قولی Schema ما هست. اگر میخواید ببینید چه Index هایی دارید میتونید از FT._LIST استفاده کنید.
- بخش دوم یعنی ON JSON تعریف میکنید که دیتا JSON هست و اینجا میتونید HASH هم بزارید.
- بخش سوم که برای Performance مهم هست این هست که محدودیت Index ایجاد میکنید که روی تمام Key ها ایجاد نشه. اینجا ما گفتیم کلید هایی که پیشوند 'user:' دارن و اگر دقت کنید در بخش Seed هم تمامی کلید ها با 'user:' شروع میشوند. توجه کنید اگر دیتا شما با این پسوند شروع نشه index نمیشه و نمیتونید سرچ انجام بدین. اگر این بخش هم نزارید کل key ها رو index میکنه یعنی '*' که ما نمیخوایم.
- بخش چهارم که Schema رو تعریف میکنیم با انواع data type ها. اول مسیر فیلد رو با #JSONPath مشخص میکنیم و بعد برای Query زدن با استفاده از AS براشون Alias میزاریم و البته در آخر نوع data type هم مشخص میکنیم.
در اینجا age از نوع عددی هست و بقیه TEXT. در اینجا هم آپشن های متنوعی وجود داره مثل استفاده از Geo میتونید مختصات جغرافیایی بزارید و Query های خاص خودش رو استفاده کنید. مثلا در app های دوست یابی میخواین نزدیک ترین افراد رو به کاربر پیدا کنید.
حالا یک سری Query رو با هم برسی میکنیم.
مثلا افرادی رو میخوایم که بالا 30 سال سن دارن و از offset 0 شروع کن 2 تا نتیجه رو برای ما بیار
اینجا هست که با استفاده از Alias هایی که بالا مشخص کردیم میتونیم Query بزنیم روی ایندکسی که میخوایم.
حالا اگر بخوایم ادمایی که 34 سال دارن رو ببینیم.
این دوتا Query برابر هستن از نظر خروجی. تنها تفاوت این هست که #Redis در Query lang که داره برای حفظ Backward compatibility سینتکس های جدید که اضافه میکنه رو با DIALECT دسته بندی کرده که در دومی DIALECT مدل 2 رو میبینم.
حالا یکی رو میخوایم ببینیم که توی یک شهر خاص زندگی میکنه و میخوایم فقط اسمش رو ببینیم.
حالا میخوایم تمام کاربرا رو بر اساس سن Sort شده ببینیم.
اینجا جا داره بگم به قول خارجی های Sky is the limit کلی قابلیت دیگه وجود داره که واقعا ارزش برسی داره مثل Aggregate ها که قدرت خیلی زیادی داره یا کار کردن با Vector ها.
هدف از این پست آشنایی با این بخش بود. در آینده بخش های بیشتری رو برسی میکنیم. امیدوارم موفق باشید.
اولین نکته این که شما توانایی index کردن HASH ها و JSON ها رو دارید. یعنی اگر پروژتون الان روی HASH هست بدون هیچ دردسری میتونید از Query های Redis Search استفاده کنید. برای پست امروز با Redis JSON کار میکنیم باتوجه به این که مطالعه کوچیکی درموردشون داشتیم. اولین کاری که میکنیم #Redis رو با دیتا فیک Seed میکنیم.
JSON.SET user:0 $ '{"name":"Farah","city":"Malibong East","age":21}'
JSON.SET user:1 $ '{"name":"Wyn","city":"Hezheng Chengguanzhen","age":62}'
JSON.SET user:2 $ '{"name":"Frederich","city":"Liujia","age":32}'
JSON.SET user:3 $ '{"name":"Maria","city":"Tudela","age":47}'
JSON.SET user:4 $ '{"name":"Marty","city":"Irtyshskiy","age":48}'
JSON.SET user:5 $ '{"name":"Glendon","city":"Bagorejo","age":59}'
JSON.SET user:6 $ '{"name":"Minne","city":"San Pedro","age":59}'
JSON.SET user:7 $ '{"name":"Garrett","city":"Shuangpu","age":26}'
JSON.SET user:8 $ '{"name":"Anna-diana","city":"Jalālpur","age":32}'
JSON.SET user:9 $ '{"name":"Silas","city":"Qacha’s Nek","age":34}'درمورد کار کردن با JSON در پست قبلی توضیح دادیم. مرحله بعدی این هست که Index و Schema مناسب برای این دیتا ایجاد کنیم که بتونیم Query بزنیم.
FT.CREATE idx:user ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC $.city AS city TEXT
به FT.CREATE ما میتونیم ایندکس جدید ایجاد کنیم. این کامند بسیار آپشن های زیادی داره و پیشنهاد میکنم حتما داکیومنت مربوط بهش رو بخونید به عنوان مثال میتونید بعضی از Field ها که نیاز ندارید داخل Index قرار ندین ولی توی Schema شما وجود داشته باشه. برای امروز ما سعی میکنیم تا حد ممکن مثال رو ساده نگه داریم.
- بخش اول یعنی idx:user اسم ایندکس یا به قولی Schema ما هست. اگر میخواید ببینید چه Index هایی دارید میتونید از FT._LIST استفاده کنید.
- بخش دوم یعنی ON JSON تعریف میکنید که دیتا JSON هست و اینجا میتونید HASH هم بزارید.
- بخش سوم که برای Performance مهم هست این هست که محدودیت Index ایجاد میکنید که روی تمام Key ها ایجاد نشه. اینجا ما گفتیم کلید هایی که پیشوند 'user:' دارن و اگر دقت کنید در بخش Seed هم تمامی کلید ها با 'user:' شروع میشوند. توجه کنید اگر دیتا شما با این پسوند شروع نشه index نمیشه و نمیتونید سرچ انجام بدین. اگر این بخش هم نزارید کل key ها رو index میکنه یعنی '*' که ما نمیخوایم.
- بخش چهارم که Schema رو تعریف میکنیم با انواع data type ها. اول مسیر فیلد رو با #JSONPath مشخص میکنیم و بعد برای Query زدن با استفاده از AS براشون Alias میزاریم و البته در آخر نوع data type هم مشخص میکنیم.
در اینجا age از نوع عددی هست و بقیه TEXT. در اینجا هم آپشن های متنوعی وجود داره مثل استفاده از Geo میتونید مختصات جغرافیایی بزارید و Query های خاص خودش رو استفاده کنید. مثلا در app های دوست یابی میخواین نزدیک ترین افراد رو به کاربر پیدا کنید.
حالا یک سری Query رو با هم برسی میکنیم.
مثلا افرادی رو میخوایم که بالا 30 سال سن دارن و از offset 0 شروع کن 2 تا نتیجه رو برای ما بیار
FT.SEARCH idx:user '@age:[30 +inf]' LIMIT 0 2
اینجا هست که با استفاده از Alias هایی که بالا مشخص کردیم میتونیم Query بزنیم روی ایندکسی که میخوایم.
حالا اگر بخوایم ادمایی که 34 سال دارن رو ببینیم.
FT.SEARCH idx:user '@age:[34 34]'
FT.SEARCH idx:user '@age==34' DIALECT 2
این دوتا Query برابر هستن از نظر خروجی. تنها تفاوت این هست که #Redis در Query lang که داره برای حفظ Backward compatibility سینتکس های جدید که اضافه میکنه رو با DIALECT دسته بندی کرده که در دومی DIALECT مدل 2 رو میبینم.
حالا یکی رو میخوایم ببینیم که توی یک شهر خاص زندگی میکنه و میخوایم فقط اسمش رو ببینیم.
FT.SEARCH idx:user '@city:San Pedro' RETURN 1 name
حالا میخوایم تمام کاربرا رو بر اساس سن Sort شده ببینیم.
FT.SEARCH idx:user '*' SORTBY age DESC
اینجا جا داره بگم به قول خارجی های Sky is the limit کلی قابلیت دیگه وجود داره که واقعا ارزش برسی داره مثل Aggregate ها که قدرت خیلی زیادی داره یا کار کردن با Vector ها.
هدف از این پست آشنایی با این بخش بود. در آینده بخش های بیشتری رو برسی میکنیم. امیدوارم موفق باشید.
👍7