RediSearch 2.0 ออก public preview แล้ว! ฟีเจอร์ส่วนใหญ่ใน major release นี้ขับเคลื่อนโดย feedback ของคุณ โดยเน้นที่การปรับปรุง developer experience และ scalability ที่เพิ่มขึ้น แตบล็อกโพสต์นี้โฟกัสที่ช่วยคุณเริ่มต้นใช้งานความสามารถในการดัชนีข้อมูลใหม่ของ RediSearch 2.0 และวิธีที่ดีกว่าในการสร้างดัชนี
การมี query and aggregation engine ที่หลากหลายภายในฐานข้อมูล Redis ของคุณ เปิดประตูไปสู่แอปพลิเคชันใหม่มากมายที่ไปไกลกว่า caching คุณสามารถใช้ Redis เป็น primary database แม้เมื่อคุณต้องเข้าถึงข้อมูลด้วย complex queries โดยไม่เพิ่มความซับซ้อนให้โค้ดเพื่ออัปเดตและดัชนีข้อมูล ทั้งหมดนี้พร้อมความเร็ว ความน่าเชื่อถือ และความสามารถในการขยายขนาดที่มีชื่อเสียงของ Redis!
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งใหม่ ดู Introducing RediSearch 2.0
เริ่มต้นใช้งาน
ข้อกำหนดก่อนหน้า (Prerequisites)
เพื่อเริ่มต้นกับ RediSearch 2.0 คุณจะต้องมี:
- Docker
- Redis command-line interface ตัวเลือกหลักของคุณคือ 2 อย่าง:
- redis-cli ที่มาพร้อม Redis
- RedisInsight GUI ฟรีสำหรับการพัฒนาแอป Redis ที่ streamlined ซึ่งก็รวม command-line interface ด้วย
รับฐานข้อมูล Redis ที่เปิดใช้งาน RediSearch
คุณสามารถติดตั้งและใช้ RediSearch 2.0 ได้หลายวิธี:
- Redis Enterprise Cloud
- Redis Enterprise Software
- RediSearch binaries
- RediSearch sources
- Docker image
เพื่อความง่าย บล็อกโพสต์นี้จะใช้ Docker images (หากคุณติดตั้ง RedisSearch 2.0 แล้ว คุณสามารถข้ามไปส่วนถัดไปได้) ในการเริ่มต้น Redis instance ด้วย Docker ให้เปิด terminal และรันคำสั่งต่อไปนี้:
> docker run -it --rm --name redis-search-2 \ -p 6379:6379 \ redis/redisearch:2.0.0
หมายเหตุ: Container จะถูกลบอัตโนมัติเมื่อออก (พารามิเตอร์ –rm)
เชื่อมต่อกับ Redis และแทรกข้อมูล
ใช้ Redis client ที่คุณชอบ เชื่อมต่อกับฐานข้อมูล RediSearch
หากคุณเริ่ม Redis instance ด้วย Docker คุณสามารถใช้คำสั่งต่อไปนี้เพื่อใช้ redis-cli ที่ฝังอยู่ใน container:
> docker exec -it redis-search-2 redis-cli
หากคุณอยากใช้ Redis Insight ให้เพิ่ม RediSearch instance ของคุณและไปที่ CLI
แทรกข้อมูล
ตอนนี้คุณพร้อมที่จะแทรกข้อมูลตัวอย่าง ใช้ข้อมูลหนังที่จัดเก็บเป็น Redis Hashes มาแทรกหนัง 2 เรื่อง:
> HSET movie:11002 title "Star Wars: Episode V - The Empire Strikes Back" plot "Luke Skywalker begins Jedi training with Yoda." release_year 1980 genre "Action" rating 8.7 votes 1127635 (integer) 6 > HSET movie:11003 title "The Godfather" plot "The aging patriarch of an organized crime dynasty transfers control of his empire to his son." release_year 1972 genre "Drama" rating 9.2 votes 1563839 (integer) 6
ตอนนี้ฐานข้อมูลมี Hashes 2 ตัว ง่ายที่จะดึงข้อมูลด้วยคำสั่งต่อไปนี้ หากคุณรู้ key ของหนัง (movie:11002):
> HMGET movie:11002 title rating 1) "Star Wars: Episode V - The Empire Strikes Back" 2) "8.7"
แต่คุณจะสอบถามฐานข้อมูลเพื่อรับรายการหนังโดยใช้ title, genre หรือ release_year ได้อย่างไร?
ด้วยโครงสร้างข้อมูล "core" ของ Redis คุณต้องจัดการดัชนีเองโดยใช้ Sets เพื่อเชื่อมโยง genre กับรายการ movie IDs ตัวอย่าง และเพิ่มโค้ดมากในแอปพลิเคชันของคุณเพื่อจัดการและสอบถามดัชนี
แตกับ RediSearch คุณสามารถเพียงกำหนดดัชนีที่เกี่ยวข้องกับข้อมูลของคุณ และให้ฐานข้อมูลจัดการพวกเขา คุณจึงสามารถใช้ query engine เพื่อสอบถาม/ค้นหาข้อมูลโดยใช้ secondary indices
สร้างดัชนี RediSearch สำหรับหนัง
เพื่อสร้างดัชนี คุณต้องกำหนด schema เพื่อระบุฟิลด์และประเภทของพวกเขาที่ถูกดัชนี และที่คุณสามารถใช้ในคิวรีของคุณ
สำหรับตัวอย่างนี้ คุณจะดัชนี 4 ฟิลด์:
- Title
- Release year
- Rating
- Genre
การสร้างดัชนีทำด้วยคำสั่ง FT.CREATE:
> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLE OK
ก่อนรันคิวรี มาดูคำสั่ง FT.CREATE ใกล้ชิด:
- idx:movie: ชื่อของดัชนี ซึ่งคุณจะใช้เมื่อทำคิวรี
- ON hash: ประเภทโครงสร้างที่จะถูกดัชนี (โปรดทราบว่า RediSearch 2.0 รองรับเฉพาะโครงสร้าง Hash แต่พารามิเตอร์นี้จะอนุญาตให้ RediSearch ดัชนีโครงสร้างอื่นๆ ในอนาคต)
- PREFIX 1 “movie:”: prefix ของคีย์ที่ควรถูกดัชนี นี่คือรายการ ดังนั้นเนื่องจากเราอยากดัชนีแค่ movie:* keys จำนวนคือ 1 หากคุณอยากดัชนีหนังและรายการทีวีด้วยฟิลด์เดียวกัน คุณอาจใช้: PREFIX 2 “movie:” “tv_show:”
- SCHEMA …: กำหนด schema ฟิลด์ และประเภทของพวกเขาที่จะดัชนี ตามที่คุณเห็นในคำสั่ง เราใช้ TEXT, NUMERIC, และ TAG และพารามิเตอร์ SORTABLE
RediSearch 2.0 engine จะสแกนฐานข้อมูลโดยใช้ค่า PREFIX และอัปเดตดัชนีตามการกำหนด schema นี่ทำให้ ง่ายต่อการเพิ่มดัชนีไปยังแอปพลิเคชันที่มีอยู่ ที่ใช้ Hashes ไม่ต้องเปลี่ยนโค้ดของคุณ
คุณสามารถดูข้อมูลดัชนีด้วยคำสั่งต่อไปนี้:
> FT.INFO idx:movie 1) index_name 2) idx:movie ... 46) 1) global_idle 2) (integer) 0 ...
ตอนนี้เราพร้อมที่จะใช้ดัชนีและสอบถามฐานข้อมูล
สอบถามฐานข้อมูลหนัง
สำหรับส่วนนี้ คุณจะใช้คำสั่ง FT.SEARCH และ syntax ของมัน โปรดทราบว่าเป้าหมายของบล็อกโพสต์นี้คือให้คุณเริ่มต้น ดังนั้นเราจึงมุ่งเน้นที่พื้นฐานและไม่ได้ลงลึกในทุกรายละเอียด เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับ RediSearch โปรดดูเอกสารและ tutorial
Full-text search queries
RediSearch เป็น full-text search engine อนุญาตให้แอปพลิเคชันรันคิวรีที่ทรงพลังแบบ Google ตัวอย่างเช่น เพื่อค้นหาหนังทั้งหมดที่มีข้อมูลเกี่ยวกับ "war" คุณจะรันคำสั่งต่อไปนี้:
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 1 2) "movie:11002" 3) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
ตามที่คุณเห็น หนัง Star Wars: Episode V—The Empire Strikes Back ถูกพบ แม้คุณใช้คำว่า "war" เพื่อ match "Wars" ใน title นี่เป็นเพราะ title ถูกดัชนีเป็น text ดังนั้นฟิลด์ถูก tokenized และ stemmed
นอกจากนี้ คำสั่งไม่ได้ระบุฟิลด์ ดังนั้นคำว่า "war" (และคำที่เกี่ยวข้อง) ถูกค้นหาในทุก text fields ของดัชนี หากคุณอยากค้นหาฟิลด์เฉพาะ คุณจะใช้ @field notation ตามที่แสดงที่นี่:
> FT.SEARCH idx:movie "@title:war" RETURN 3 title release_year rating
คุณสามารถรัน full-text search queries เพิ่มเติมกับ dataset เรียบง่ายนี้ ตามที่สาธิตที่นี่ (หมายเหตุ: เพื่อให้เอกสารสั้น ผลลัพธ์ของคิวรีไม่ได้แสดง):
Prefix matches:
> FT.SEARCH idx:movie "emp*" RETURN 3 title release_year rating
Fuzzy search:
> FT.SEARCH idx:movie "%gdfather%" RETURN 3 title release_year rating
Unions:
> FT.SEARCH idx:movie "war | %gdfather% " RETURN 3 title release_year rating
คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ query syntax ในเอกสาร RediSearch
Tag field search
ใช้ tag field "genre" เพื่อหาหนัง "drama" ทั้งหมด:
> FT.SEARCH idx:movie "@genre:{Drama}" RETURN 3 title release_year rating 1) (integer) 1 2) "movie:11003" 3) 1) "title" 2) "The Godfather" 3) "release_year" 4) "1972" 5) "rating" 6) "9.2"
Syntax @field:{value} บ่งชี้ว่าคุณกำลังค้นหาใน tag field คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ tag filter ในเอกสาร RediSearch
อัปเดตฐานข้อมูลและสอบถาม
จนถึงตอนนี้ ข้อมูลทั้งหมดที่คุณสอบถามถูกสร้างก่อนดัชนีและถูกดัชนีระหว่างการสร้างดัชนี มาเปลี่ยนเรื่องโดยเพิ่มหนังใหม่:
> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi" plot "The Rebels destroy the Empire's Death Star." release_year 1983 genre "Action" rating 8.3 votes 906260 (integer) 6
คุณสามารถนำคิวรีก่อนหน้ามาใช้ซ้ำ:
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 2 2) "movie:11005" 3) 1) "title" 2) "Star Wars: Episode VI - Return of the Jedi" 3) "release_year" 4) "1983" 5) "rating" 6) "8.3" 4) "movie:11002" 5) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
ตามที่คุณเห็น หนังใหม่ถูกดัชนีอัตโนมัติ
เช่นเดียวกัน หากคุณลบหรือ expire หนัง ดัชนีจะถูกอัปเดตอัตโนมัติ ตามที่แสดงที่นี่:
> EXPIRE "movie:11002" 15 (integer) 1
หากคุณรอ 15 วินาทีและรันคำสั่งค้นหา คุณจะเห็นว่าหนังถูกลบออกจากดัชนี
สิ่งนี้มีพลังมากเมื่อคุณอยากทำ ephemeral search และให้ฐานข้อมูลจัดการ expiration ของข้อมูลและดัชนี คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ ephemeral search ในโพสต์บล็อกของเราที่วางโครงร่าง The Case for Ephemeral Search
จากนี้ไปได้ไหน?
โพสต์นี้แบ่งปันพื้นฐานของ RediSearch บางส่วน และแสดงว่าการดัชนีข้อมูลโปร่งใสจากโค้ดแอปพลิเคชันของคุณ ฟังก์ชันนี้ใหม่ใน RediSearch 2.0 เนื่องจากใน RediSearch 1.x นักพัฒนาต้องใช้คำสั่ง FT.ADD เพื่อดัชนีข้อมูลโดยเฉพาะ
นอกจากฟังก์ชันการค้นหาและดัชนีที่อภิปรายในบล็อกโพสต์นี้ RediSearch ยังรวมความสามารถในการรวมข้อมูล (data aggregation) ที่ทรงพลัง ซึ่งครอบคลุมในเอกสาร RediSearch, tutorial และ online course
Tutorial มีข้อมูลเดียวกัน แต่ด้วย dataset ใหญ่กว่า และ sample queries และ aggregation มากขึ้น ยังมีแอปพลิเคชันที่แสดงวิธีใช้ RediSearch กับภาษาโปรแกรมอย่าง Java, Python และ Node.js เพื่อเรียนรู้เพิ่มเติม โปรดดูทรัพยากรเพิ่มเติมเหล่านี้:
- RediSearch web page
- RediSearch 2.0 Tutorial
- Rediscover Use Cases and Projects