Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การจัดทำดัชนี การสืบค้น และการค้นหาเอกสาร JSON แบบเต็มด้วย Redis

RedisJSON และ RediSearch เป็นโมดูล Redis ที่ได้รับความนิยมมากที่สุดในคลาวด์ของเรา (ดูรูปที่ 1) ภาพนักเทียบท่าของ RedisJSON และ RediSearch (ที่มาพร้อมกับ Redis) จะถูกดึงมากกว่า 2,000 ครั้งทุกวัน นี่คือเหตุผลที่เราคิดว่า Itamar Haber ผู้เผยแพร่เทคโนโลยีที่ Redis เป็นผู้มีวิสัยทัศน์เมื่อเขาเขียนเวอร์ชันแรกเมื่อ 4 ปีที่แล้ว ในเดือนเมษายน เราได้ประกาศหลายครั้งที่ RedisConf เกี่ยวกับ JSON การจัดทำดัชนี และความสามารถในการค้นหาข้อความแบบเต็ม วันนี้ เรายินดีที่จะประกาศตัวอย่างส่วนตัวของความสามารถเหล่านี้

ในบล็อกนี้ เราจะให้ภาพรวมของความสามารถของ RedisJSON ปัจจุบันแก่คุณ หลังจากนั้นเราจะเจาะลึกในส่วนความสามารถใหม่ของการแสดงตัวอย่างส่วนตัวนี้ ความสามารถในการจัดทำดัชนี สืบค้น และใช้การค้นหาข้อความแบบเต็มบนเอกสาร JSON โดยใช้ RediSearch เป็นคุณสมบัติใหม่ที่ยอดเยี่ยมที่สุดในรุ่นนี้ สุดท้ายนี้ เราจะแสดงวิธีเริ่มต้นอย่างรวดเร็วให้คุณดู

การจัดทำดัชนี การสืบค้น และการค้นหาเอกสาร JSON แบบเต็มด้วย Redis

ความสามารถของ JSON

เมื่อคุณไม่มี RedisJSON คุณจะจำลองเอกสารที่ซ้อนกันใน Redis โดยใช้โครงสร้างข้อมูลสตริง

แต่ถ้าเราต้องอัปเดตส่วนย่อยของเอกสารล่ะ

เพื่อรักษาความเป็นอะตอมมิกของการดำเนินการ เราจะต้อง:

  1. ดูเอกสาร
  2. อ่านเวอร์ชันก่อนหน้าและยกเลิกการซีเรียลไลซ์
  3. ฝังการอัปเดตในธุรกรรม Redis
  4. ทำให้เป็นอนุกรมกับ JSON และอัปเดตเอกสาร
  5. ทำธุรกรรม

เราอาจจำเป็นต้องลองทำตามขั้นตอนเหล่านี้ใหม่ทั้งหมดหากลูกค้ารายอื่นอัปเดตเอกสารในระหว่างกระบวนการนี้

อย่างไรก็ตาม ด้วย RedisJSON เราสามารถทำการอัปเดตนี้ได้ด้วยธุรกรรมอะตอมมิกเดียว :

ลองดูอีกตัวอย่างหนึ่งซึ่งคุณมี JSON ขนาดใหญ่ แต่ต้องการเพียงส่วนย่อยของเอกสารนั้นในแอปพลิเคชันของคุณ

ไม่มี RedisJSON:

คุณต้อง:

  1. ดึงสตริง json ทั้งหมด เรียงลำดับเป็นสตริง
  2. ดีซีเรียลไลซ์ JSON
  3. แยกส่วนย่อยที่คุณต้องการ

RedisJSON ช่วยให้คุณดึงเฉพาะข้อมูลที่ต้องการได้ด้วยคำสั่งเดียว ลดรอบ CPU โอเวอร์เฮดของเครือข่าย และที่สำคัญที่สุดคือเวลาแฝง

อย่างที่คุณเห็น RedisJSON ทำให้การจัดการเอกสาร JSON ง่ายขึ้น RedisJSON (v1.0) เวอร์ชัน GA ปัจจุบันเป็นเวอร์ชันที่ชุมชนใช้กันอย่างแพร่หลาย และแก้ไขข้อบกพร่องของการสร้างแบบจำลองโครงสร้างที่ซ้อนกันด้วยโครงสร้างข้อมูลสตริง นี่คือภาพรวมของความสามารถหลักบางประการ

จัดเก็บ (หรืออัปเดต) เอกสาร JSON ที่เชื่อมโยงกับคีย์ใน Redis

แทนที่ส่วนย่อย (เช่น ค่าสตริงของคีย์)

เพิ่มรายการไปยังคอลเลกชันหรือแผนที่

แตกทั้งเอกสาร

ดึงข้อมูลบางส่วนโดยใช้ชุดย่อยของ JSONPath

RedisJSON 2.0:การเปิดตัวพรีวิวส่วนตัว

เราประกาศเวอร์ชันนี้ที่ RedisConf 2021 และวันนี้เรายินดีที่จะประกาศว่าเวอร์ชันดังกล่าวพร้อมให้ใช้งานแบบพรีวิวส่วนตัวสำหรับกลุ่มลูกค้า Redis Enterprise ที่เลือกสรรแล้ว และในฐานะผู้สมัครที่จะเปิดตัวในชุมชนของเรา เวอร์ชันนี้มีคุณลักษณะหลักสามประการ ได้แก่ การสนับสนุนนิพจน์ JSONPath อย่างเต็มรูปแบบ รองรับ Active-Active (ด้วย Redis Enterprise) และความสามารถในการจัดทำดัชนี สืบค้น และใช้การค้นหาข้อความแบบเต็มบนเอกสาร JSON ด้วย RediSearch แต่มีมากกว่านั้น! มาดำดิ่งสู่สิ่งใหม่ๆ กันเถอะ

เขียนใหม่ใน RUST

ภาษาโปรแกรมระบบเป็นกลุ่มของภาษาที่เน้นประสิทธิภาพ โปรแกรมที่เขียนด้วยภาษาเหล่านี้มักจะมีน้ำหนักเบาและให้ประสิทธิภาพที่ดีที่สุด นี่คือเหตุผลที่ว่าทำไม Redis จึงมีการเขียนประวัติศาสตร์ในภาษา C และยังอธิบายว่าทำไม Redis จึงสามารถบรรลุเวลาแฝงที่ต่ำมากและมีปริมาณงานสูง โมดูล Redis ส่วนใหญ่เขียนด้วย C, C++ หรือ Rust ซึ่งเป็นภาษาในตระกูลเดียวกัน

JSON ได้รับการบริการเป็นอย่างดีโดยชุมชน Rust ซึ่งรวมถึงการทำให้เป็นอนุกรม JSON ที่รวดเร็วและมีประสิทธิภาพและการใช้งาน JSONPath การให้ประโยชน์ของการใช้งานเหล่านั้นแก่ผู้ใช้ Redis นั้นชัดเจน และเพียงแค่ต้องมีการแมประหว่าง API ของโมดูล Redis และ Rust

รองรับ JSONPath อย่างเต็มรูปแบบ

และนี่คือประโยชน์ของการเขียนใหม่ RUST นี้ เวอร์ชันใหม่นี้มีการสนับสนุน JSONPath อย่างครอบคลุม ขณะนี้คุณสามารถใช้ความหมายทั้งหมดของนิพจน์ JSONPath ได้แล้ว

ได้รับเอกสาร JSON

ไวลด์การ์ด (ก่อนหน้านี้ถูกจำกัดไว้ที่รายการแรก)

แยกชิ้น

ตัวอย่างขั้นสูงที่มีนิพจน์ตัวกรอง

รองรับการใช้งานแบบแอ็คทีฟ-แอ็คทีฟ

Active-Active เป็นคุณสมบัติที่ Redis Enterprise ให้บริการ Active-Active ช่วยให้คุณสามารถจำลองฐานข้อมูลของคุณลงในคลัสเตอร์ Redis Enterprise ที่กระจายตามภูมิศาสตร์หลายแห่ง ผู้ใช้สามารถเชื่อมต่อกับคลัสเตอร์ที่ใกล้ที่สุดด้วยเวลาแฝงในการอ่านและเขียนในเครื่อง

การใช้งานนี้ใช้เทคโนโลยี Replicated Data-Type (CRDT) ที่ปราศจากความขัดแย้ง ขณะใช้งานสำหรับโครงสร้างข้อมูลหลักส่วนใหญ่ที่รองรับโดย Redis แต่ Redis ได้พัฒนาความรู้และประสบการณ์ที่แข็งแกร่งซึ่งได้รับการยืนยันจากการใช้งานใหม่นี้ที่สร้างขึ้นสำหรับ JSON

นักพัฒนาแอปพลิเคชันสามารถพึ่งพาสิ่งนี้เพื่อสร้างแอปพลิเคชันแบบกระจายตามภูมิศาสตร์โดยใช้เอกสาร JSON ต่อไปนี้คือตัวอย่างการดำเนินการต่อเนื่องในสภาพแวดล้อมแบบแอ็คทีฟแอ็คทีฟที่มีสองคลัสเตอร์:

การจัดทำดัชนี การสืบค้น และการค้นหาเอกสาร JSON แบบเต็มด้วย Redis

ดูรายละเอียดการดำเนินการแต่ละอย่าง:

  • T1:ลูกค้าตั้งค่าเอกสาร JSON ในคลัสเตอร์ 1
  • T2:กระบวนการซิงโครไนซ์จำลองเอกสารในคลัสเตอร์ 2
  • T3:คลัสเตอร์ทั้งสองมีเอกสารเดียวกัน
  • T4:ไคลเอ็นต์เพิ่มสีฟ้าให้กับอาร์เรย์สีในคลัสเตอร์ 1 และไคลเอ็นต์อื่นเพิ่มสีเขียวลงในอาร์เรย์เดียวกันในคลัสเตอร์ 2 พร้อมกัน
  • T5:กระบวนการซิงโครไนซ์จะรวมการดำเนินการและอัปเดตเอกสารในทั้งสองคลัสเตอร์
  • T6:คลัสเตอร์ทั้งสองมีเอกสารเดียวกัน

เราจะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับขั้นตอนการซิงโครไนซ์ทั้งหมดเมื่อความสามารถนี้อยู่ในการแสดงตัวอย่างสาธารณะ แต่ถ้าคุณสนใจในความสามารถนี้ อย่าลังเลที่จะติดต่อตอนนี้ที่ [email protected]

RediSearch 2.2:การเปิดตัวพรีวิวส่วนตัว

บล็อกนี้ยังประกาศความพร้อมใช้งานของการแสดงตัวอย่างส่วนตัวสำหรับ RediSearch 2.2 (เป็นการดูตัวอย่างส่วนตัวสำหรับลูกค้า Redis Enterprise ที่เลือกไว้ และในฐานะผู้สมัครที่จะเผยแพร่ในชุมชนของเรา)

ในส่วนนี้ เราจะอธิบายคุณลักษณะใหม่ที่มีให้โดย RediSearch รุ่นใหม่นี้ แต่ก่อนอื่น นี่คือเหตุผลว่าทำไมเราจึงเปิดตัวโมดูลยอดนิยมทั้งสองนี้ด้วยกัน:

การจัดทำดัชนี การสืบค้น และการค้นหาเอกสาร JSON แบบเต็ม

ฟีเจอร์ใหม่โดยเฉพาะนี้จะนำความสามารถ JSON ของ Redis ไปสู่ระดับใหม่ทั้งหมด นอกเหนือไปจากการเป็นที่เก็บคีย์-ค่า จนถึงขณะนี้ RediSearch ได้ให้บริการจัดทำดัชนีและความสามารถในการค้นหาบนแฮช ภายใต้ประทุน RedisJSON 2.0 เปิดเผย API สาธารณะภายใน ภายใน เนื่องจาก API นี้เปิดเผยต่อโมดูลอื่นๆ ที่ทำงานอยู่ในโหนด Redis สาธารณะ เนื่องจากโมดูลใดๆ สามารถใช้ API นี้ได้ RediSearch 2.2 ก็เช่นกัน !

RedisJSON ช่วยให้ RediSearch สามารถจัดทำดัชนีเอกสาร JSON ได้ด้วยการเปิดเผยความสามารถของตนไปยังโมดูลอื่นๆ เพื่อให้ผู้ใช้สามารถค้นหาเอกสารได้ด้วยการจัดทำดัชนีและสืบค้นเนื้อหา โมดูลที่รวมกันเหล่านี้ช่วยให้คุณฐานข้อมูลเอกสารที่เน้น JSON ที่มีประสิทธิภาพและมีเวลาแฝงต่ำ !

มาดูกันว่าจะหน้าตาเป็นอย่างไร

อันดับแรก เราควรเติมฐานข้อมูลด้วยเอกสาร JSON โดยใช้คำสั่ง JSON.SET

ในการสร้างดัชนีใหม่ เราใช้คำสั่ง FT.CREATE สคีมาของดัชนีในขณะนี้ยอมรับนิพจน์ JSONPath ผลลัพธ์ของนิพจน์ได้รับการจัดทำดัชนีและเชื่อมโยงกับแอตทริบิวต์ (ที่นี่:ชื่อ)

ขณะนี้เราสามารถค้นหาและค้นหาเอกสาร JSON ของเราโดยใช้ FT.SEARCH:

การรวมในเอกสาร JSON

การรวมเป็นคุณลักษณะที่มีประสิทธิภาพของ RediSearch ที่สามารถใช้เพื่อสร้างรายงานการวิเคราะห์หรือดำเนินการค้นหารูปแบบการค้นหาแบบเหลี่ยมเพชรพลอย ขณะนี้ RediSearch สามารถเข้าถึงเอกสาร JSON ได้แล้ว จึงเป็นไปได้ที่จะโหลดค่าใดๆ จากเอกสาร JSON โดยใช้นิพจน์ JSONPath และใช้ในไปป์ไลน์ ไม่ว่าค่านั้นจะได้รับการจัดทำดัชนีหรือไม่

มาสร้างดัชนีกันเถอะ:

เพิ่มเอกสาร JSON ลงในฐานข้อมูล:

และทำการคำนวณอย่างง่ายโดยใช้ค่าตัวเลขสองค่าที่ดึงมาจากเอกสาร JSON:

ความยืดหยุ่นมากขึ้นในกลยุทธ์การจัดทำดัชนี

ด้วย RediSearch เวอร์ชันใหม่ ขณะนี้สามารถจัดทำดัชนีค่าเดียวกัน (ฟิลด์บนแฮช หรือค่า JSON จากเอกสาร JSON) ด้วยพารามิเตอร์ที่แตกต่างกัน นี่คือกรณีการใช้งานทั่วไป ซึ่งแก้ไขได้ด้วยฟีเจอร์ใหม่นี้:

มาสร้างฐานข้อมูลที่มีเอกสารที่อยู่ในหมวดหมู่กันเถอะ

การใช้ประเภท TAG คุณสามารถกรองผลการค้นหาของคุณในหมวดหมู่ใดก็ได้:

แต่ถ้าคุณต้องการที่จะทำการค้นหาข้อความแบบเต็มในหมวดหมู่ด้วยล่ะ

จนถึงขณะนี้ เมื่อใช้แฮช คุณต้องทำซ้ำค่าเป็นสองฟิลด์ ซึ่งจะใช้หน่วยความจำเป็นสองเท่า

นี่คือจุดที่ FT.CREATE…AS มีประโยชน์มากกว่า กลับมาที่เอกสารที่ดีและเรียบง่ายของเรากัน:

…และใช้ฟีเจอร์ AS ใหม่:

…และ…

บิงโก! ขณะนี้เราสามารถกรองตามแท็ก และทำการค้นหาข้อความแบบเต็มในฟิลด์เดียวกัน โดยไม่ต้องทำซ้ำข้อมูล

โปรไฟล์การค้นหา

ความซับซ้อนของเวลาของคำสั่ง Redis ส่วนใหญ่ได้รับการบันทึกไว้เป็นอย่างดี ตัวอย่างเช่น HMGET มาพร้อมกับความซับซ้อนของ O(N) “โดยที่ N คือจำนวนฟิลด์ที่ร้องขอ” ด้วย RediSearch คุณสามารถเขียนข้อความค้นหาขั้นสูงได้ อย่างไรก็ตาม ความซับซ้อนของคำสั่ง FT.SEARCH และ FT.AGGREGATE ขึ้นอยู่กับความซับซ้อนของการสืบค้น

เราต้องการมอบเครื่องมือให้คุณเพื่อทำความเข้าใจว่าเกิดอะไรขึ้นภายใต้ประทุนเมื่อมีการดำเนินการสืบค้นข้อมูล เพื่อค้นหาว่าเวลาใดที่ถูกใช้ไป และวิธีเพิ่มประสิทธิภาพการสืบค้นข้อมูล คำสั่ง FT.PROFILE ใหม่จะส่งคืนโครงสร้างที่แสดงขั้นตอนหลักที่ RediSearch ใช้เพื่อดำเนินการค้นหา ในแต่ละขั้นตอนจะมีการให้ข้อมูลเวลา

แล้วจะเกิดอะไรขึ้นใน RediSearch เมื่อเราทำการค้นหาแบบคลุมเครือ

มาดูตัวอย่างกัน:

เราพร้อมที่จะทำโปรไฟล์คำถามของเรา มาเรียกใช้การทำโปรไฟล์และแยกย่อยผลลัพธ์การทำโปรไฟล์

redis.cloud:6379> FT.PROFILE idx SEARCH LIMITED QUERY "%hello%"

ก่อนอื่นเราได้ผลลัพธ์ มีประโยชน์ในการตรวจสอบว่าแบบสอบถามการทำโปรไฟล์ส่งคืนสิ่งที่คาดหวัง

นี่คือเวลาทั้งหมดที่เรียกว่า “เวลาโปรไฟล์” เพราะมันรวมเวลาที่ใช้ในการรวบรวมข้อมูลโปรไฟล์ด้วย

เวลาที่ใช้ในการแยกวิเคราะห์แบบสอบถามและสร้างแผนการดำเนินการ:

นี่คือเวลาที่ใช้ในการหาคู่ที่คลุมเครือในพจนานุกรม:

และสุดท้าย คุณเคยสงสัยหรือไม่ว่าการสร้างผลการค้นหาหมายความว่าอย่างไร เราจำเป็นต้องคำนวณคะแนนเต็มของเอกสารแต่ละฉบับ จัดเรียงตามคะแนน และสุดท้ายโหลดฟิลด์ ด้วยข้อมูลนี้ คุณสามารถระบุปัญหาคอขวด ทำการสืบค้นได้เร็วขึ้น และปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์

วิธีเริ่มต้น

เราเชื่อว่าความสามารถใหม่เหล่านี้เป็นตัวเปลี่ยนเกมสำหรับนักพัฒนาแอปพลิเคชันและชุมชน Redis นี่คือวิธีเริ่มต้น

ใช้ภาพนักเทียบท่าของการแสดงตัวอย่าง

ในการเริ่มต้น คุณสามารถดึงภาพนักเทียบท่าต่อไปนี้ด้วยแท็ก :preview:

docker run -p 6379:6379 redis/redismod:preview

อีกวิธีหนึ่ง คุณสามารถคอมไพล์จากแท็กรีลีส RC1 (v2.2.0 สำหรับ RediSearch, v2.0.0 สำหรับ RedisJSON) บนที่เก็บทั้งสองและโหลดไปที่ Redis

เมื่อคุณพร้อมและใช้งานแล้ว คุณสามารถลองใช้คำสั่งด้านบนทั้งหมดหรือด้วยคู่มือการเริ่มต้นฉบับย่อนี้ นอกจากนี้ เราจะเปิดตัวชุดบล็อกเกี่ยวกับ RedisMart ซึ่งเป็นแอปพลิเคชันการค้าปลีกออนไลน์ที่เราได้แสดงในระหว่างการกล่าวสุนทรพจน์ของ RedisConf 2021 RedisMart ใช้ประโยชน์จาก RediSearch และ RedisJSON ที่ปรับใช้ในลักษณะการกระจายทางภูมิศาสตร์เพื่อมอบประสบการณ์การค้าปลีกออนไลน์ที่ดีที่สุด ในชุดนี้ เราจะแนะนำคุณทีละขั้นตอนในการสร้างแอปพลิเคชันนี้

พัฒนาโดยใช้ไคลเอ็นต์ที่เข้ากันได้เวอร์ชันล่าสุด

ขณะนี้รายชื่อลูกค้าต่อไปนี้กำลังได้รับการอัปเกรด ดังนั้นคุณจึงสามารถใช้คุณลักษณะใหม่พร้อมประสบการณ์สำหรับนักพัฒนาที่ดีได้ ตรวจสอบรุ่นล่าสุดและ/หรือคำขอดึง (ในขณะนี้ส่วนใหญ่สนับสนุนเวอร์ชันตัวอย่างบนสาขาหลัก)

RedisJSON ค้นหาซ้ำ
Node.js redis-modules-sdk redis-modules-sdk
จาวา JredisJSON JRediSearch
.NET NRedisJSON NRRediSearch
หลาม redisjson-py redisearch-py

เข้าร่วมชุมชน

เรายินดีรับฟังความคิดเห็น รายงานข้อบกพร่อง คำขอคุณลักษณะ ในขณะที่เราดำเนินการเพื่อให้มีความพร้อมใช้งานทั่วไป แสดงความคิดเห็นในเว็บไซต์เอกสารหรือในที่เก็บ github ของ RediSearch (บน Github) หรือ RedisJSON (บน Github) หรือติดต่อเราทาง Discord