{"id":116,"date":"2026-09-19T18:45:19","date_gmt":"2026-09-19T18:45:19","guid":{"rendered":"http:\/\/127.0.0.1:8080\/index.php\/2026\/09\/19\/giai-ma-tin-planetscale-khuay-dao-hacker-news-voi-cong-nghe-full-text-search-nhanh-gap-25-lan-cho-postgres\/"},"modified":"2026-09-19T18:45:19","modified_gmt":"2026-09-19T18:45:19","slug":"giai-ma-tin-planetscale-khuay-dao-hacker-news-voi-cong-nghe-full-text-search-nhanh-gap-25-lan-cho-postgres","status":"publish","type":"post","link":"https:\/\/zunliz.com\/index.php\/2026\/09\/19\/giai-ma-tin-planetscale-khuay-dao-hacker-news-voi-cong-nghe-full-text-search-nhanh-gap-25-lan-cho-postgres\/","title":{"rendered":"Gi\u1ea3i m\u00e3 TIN: PlanetScale khu\u1ea5y \u0111\u1ea3o Hacker News v\u1edbi c\u00f4ng ngh\u1ec7 Full-Text Search nhanh g\u1ea5p 25 l\u1ea7n cho Postgres"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">S\u1ef1 ki\u1ec7n PlanetScale c\u00f4ng b\u1ed1 TIN (Text INdex) kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t th\u00f4ng b\u00e1o s\u1ea3n ph\u1ea9m m\u1edbi; \u0111\u00f3 l\u00e0 m\u1ed9t c\u00fa s\u1ed1c ki\u1ebfn tr\u00fac \u0111\u1ed1i v\u1edbi c\u1ed9ng \u0111\u1ed3ng PostgreSQL to\u00e0n c\u1ea7u. V\u1edbi hi\u1ec7u n\u0103ng v\u01b0\u1ee3t tr\u1ed9i g\u1ea5p 25 l\u1ea7n so v\u1edbi ParadeDB v\u00e0 kh\u1ea3 n\u0103ng x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi (concurrency) v\u01b0\u1ee3t xa c\u00e1c gi\u1edbi h\u1ea1n v\u1eadt l\u00fd c\u1ee7a GIN index truy\u1ec1n th\u1ed1ng, TIN \u0111ang t\u00e1i \u0111\u1ecbnh ngh\u0129a c\u00e1ch ch\u00fang ta th\u1ef1c hi\u1ec7n Full-Text Search (FTS) ngay trong l\u00f2ng c\u01a1 s\u1edf d\u1eef li\u1ec7u quan h\u1ec7. B\u00e0i vi\u1ebft n\u00e0y t\u1eeb ZunLiz.com s\u1ebd b\u00f3c t\u00e1ch s\u00e2u v\u00e0o ki\u1ebfn tr\u00fac 48-bit ctid, k\u1ef9 thu\u1eadt SIMD vectorization v\u00e0 cu\u1ed9c chi\u1ebfn &#8220;Open Source vs. Managed Performance&#8221; \u0111ang l\u00e0m d\u1eady s\u00f3ng Hacker News.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">1. \u0110i\u1ec3m Ngh\u1ebdn Mu\u00f4n Thu\u1edf C\u1ee7a Postgres Full-Text Search: V\u00ec Sao GIN V\u00e0 GiST H\u1ee5t H\u01a1i?<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">PostgreSQL t\u1eeb l\u00e2u \u0111\u00e3 cung c\u1ea5p kh\u1ea3 n\u0103ng t\u00ecm ki\u1ebfm to\u00e0n v\u0103n th\u00f4ng qua <code>tsvector<\/code> v\u00e0 <code>tsquery<\/code>. Tuy nhi\u00ean, ki\u1ebfn tr\u00fac GIN (Generalized Inverted Index) hi\u1ec7n t\u1ea1i \u0111ang b\u1ed9c l\u1ed9 nh\u1eefng \u0111i\u1ec3m y\u1ebfu ch\u00ed t\u1eed khi quy m\u00f4 d\u1eef li\u1ec7u \u0111\u1ea1t ng\u01b0\u1ee1ng h\u00e0ng tr\u0103m tri\u1ec7u b\u1ea3n ghi:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Write Amplification &amp; Vacuum Bloat:<\/strong> GIN index l\u01b0u tr\u1eef danh s\u00e1ch c\u00e1c v\u1ecb tr\u00ed (posting lists) cho m\u1ed7i t\u1eeb kh\u00f3a. Khi m\u1ed9t h\u00e0ng \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt, to\u00e0n b\u1ed9 entry trong GIN index th\u01b0\u1eddng ph\u1ea3i \u0111\u01b0\u1ee3c ghi l\u1ea1i, g\u00e2y ra hi\u1ec7n t\u01b0\u1ee3ng &#8220;write amplification&#8221; kh\u1ee7ng khi\u1ebfp v\u00e0 l\u00e0m ph\u00ecnh to index (bloat), d\u1eabn \u0111\u1ebfn hi\u1ec7u n\u0103ng suy gi\u1ea3m theo th\u1eddi gian.<\/li>\r\n<li><strong>Thi\u1ebfu BM25 nguy\u00ean b\u1ea3n:<\/strong> Postgres m\u1eb7c \u0111\u1ecbnh s\u1eed d\u1ee5ng <code>ts_rank<\/code> d\u1ef1a tr\u00ean t\u1ea7n su\u1ea5t xu\u1ea5t hi\u1ec7n, thi\u1ebfu \u0111i c\u00e1c thu\u1eadt to\u00e1n x\u1ebfp h\u1ea1ng hi\u1ec7n \u0111\u1ea1i nh\u01b0 BM25, khi\u1ebfn k\u1ebft qu\u1ea3 t\u00ecm ki\u1ebfm kh\u00f4ng \u0111\u1ea1t \u0111\u1ed9 ch\u00ednh x\u00e1c cao nh\u01b0 Elasticsearch hay Lucene.<\/li>\r\n<li><strong>Memory Bound:<\/strong> GIN index y\u00eau c\u1ea7u t\u1ea3i c\u00e1c ph\u1ea7n c\u1ee7a index v\u00e0o <code>shared_buffers<\/code>. Khi t\u1eadp d\u1eef li\u1ec7u v\u01b0\u1ee3t qu\u00e1 RAM, vi\u1ec7c truy c\u1eadp \u0111\u0129a (disk I\/O) tr\u1edf th\u00e0nh n\u00fat th\u1eaft c\u1ed5 chai, d\u1eabn \u0111\u1ebfn hi\u1ec7n t\u01b0\u1ee3ng treo (stall) khi th\u1ef1c hi\u1ec7n c\u00e1c truy v\u1ea5n ph\u1ee9c t\u1ea1p (conjunction\/phrase queries).<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">2. Gi\u1ea3i M\u00e3 \u0110\u1ed9t Ph\u00e1 K\u1ef9 Thu\u1eadt C\u1ee7a TIN: Ngh\u1ec7 Thu\u1eadt T\u1eadn D\u1ee5ng 48-Bit ctid v\u00e0 SIMD Vectorization<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">TIN (Text INdex) do Eric Ridge v\u00e0 Patrick Reynolds thi\u1ebft k\u1ebf \u0111\u00e3 thay \u0111\u1ed5i cu\u1ed9c ch\u01a1i b\u1eb1ng c\u00e1ch lo\u1ea1i b\u1ecf ho\u00e0n to\u00e0n l\u1edbp trung gian &#8220;Document ID mapping&#8221;.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Ki\u1ebfn tr\u00fac 48-bit ctid:<\/strong> Trong c\u00e1c engine nh\u01b0 Lucene hay Tantivy, h\u1ec7 th\u1ed1ng ph\u1ea3i duy tr\u00ec m\u1ed9t b\u1ea3ng \u00e1nh x\u1ea1 (mapping table) gi\u1eefa DocID (1..n) v\u00e0 \u0111\u1ecba ch\u1ec9 v\u1eadt l\u00fd tr\u00ean \u0111\u0129a. TIN b\u1ecf qua b\u01b0\u1edbc n\u00e0y. N\u00f3 s\u1eed d\u1ee5ng tr\u1ef1c ti\u1ebfp <code>ctid<\/code> c\u1ee7a Postgres (g\u1ed3m 32-bit block number v\u00e0 16-bit offset) l\u00e0m \u0111\u1ecbnh danh t\u00e0i li\u1ec7u. Vi\u1ec7c \u00e1nh x\u1ea1 O(1) tr\u1ef1c ti\u1ebfp v\u00e0o heap gi\u00fap TIN truy xu\u1ea5t d\u1eef li\u1ec7u m\u00e0 kh\u00f4ng c\u1ea7n tra c\u1ee9u b\u1ea3ng ph\u1ee5, gi\u1ea3m thi\u1ec3u \u0111\u00e1ng k\u1ec3 \u0111\u1ed9 tr\u1ec5.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>SIMD &amp; AVX-512 Vectorization:<\/strong> \u0110\u00e2y l\u00e0 &#8220;v\u0169 kh\u00ed b\u00ed m\u1eadt&#8221; c\u1ee7a TIN. Thay v\u00ec duy\u1ec7t qua c\u00e1c posting list b\u1eb1ng v\u00f2ng l\u1eb7p CPU truy\u1ec1n th\u1ed1ng, TIN s\u1eed d\u1ee5ng t\u1eadp l\u1ec7nh AVX-512 \u0111\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c ph\u00e9p to\u00e1n logic (AND, OR, NOT) tr\u00ean c\u00e1c m\u1ea3ng bit (bitmaps) \u1edf c\u1ea5p \u0111\u1ed9 ph\u1ea7n c\u1ee9ng. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p TIN x\u1eed l\u00fd h\u00e0ng tri\u1ec7u b\u1ea3n ghi trong t\u00edch t\u1eafc, gi\u1ea3i th\u00edch t\u1ea1i sao n\u00f3 \u0111\u1ea1t \u0111\u01b0\u1ee3c p99 latency th\u1ea5p h\u01a1n 26 l\u1ea7n so v\u1edbi ParadeDB.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">3. So S\u00e1nh Hi\u1ec7u N\u0103ng To\u00e0n Di\u1ec7n: TIN vs ParadeDB vs pg_textsearch vs GIN<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-table\">\r\n<table style=\"border-collapse: collapse;width: 100%;border: 1px solid #ddd\">\r\n<thead>\r\n<tr style=\"background-color: #f4f4f4\">\r\n<th style=\"padding: 12px;border: 1px solid #ddd\">Ch\u1ec9 s\u1ed1 (Dataset 85GB)<\/th>\r\n<th style=\"padding: 12px;border: 1px solid #ddd\">TIN (PlanetScale)<\/th>\r\n<th style=\"padding: 12px;border: 1px solid #ddd\">ParadeDB<\/th>\r\n<th style=\"padding: 12px;border: 1px solid #ddd\">Postgres GIN<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">Mixed Queries (QPS)<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\"><strong>199<\/strong><\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">7.9<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">Crash (OOM)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">p99 Latency (ms)<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\"><strong>256<\/strong><\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">6,765<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">N\/A<\/td>\r\n<\/tr>\r\n<tr>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">Build Index Time<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\"><strong>8m 10s<\/strong><\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">19m 20s<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">&gt; 2h 09m<\/td>\r\n<\/tr>\r\n<tr>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">Concurrent Writes (1k\/s)<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\"><strong>125-172 QPS<\/strong><\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">2.2-6.0 QPS<\/td>\r\n<td style=\"padding: 12px;border: 1px solid #ddd\">Stall (735 updates)<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">4. G\u00f3c Nh\u00ecn Hacker News &amp; L\u1ef1a Ch\u1ecdn Ki\u1ebfn Tr\u00fac Cho K\u1ef9 S\u01b0: Open Source vs Cloud Lock-In<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Cu\u1ed9c tranh lu\u1eadn tr\u00ean Y Combinator xoay quanh tri\u1ebft l\u00fd &#8220;Source-Available&#8221; c\u1ee7a PlanetScale. Vi\u1ec7c PlanetScale ch\u1ec9 m\u1edf m\u00e3 ngu\u1ed3n ph\u1ea7n &#8220;lead&#8221; (\u0111\u1ec3 ki\u1ec3m tra c\u00fa ph\u00e1p) m\u00e0 gi\u1eef k\u00edn engine TIN th\u1ef1c s\u1ef1 \u0111\u00e3 g\u00e2y ra s\u1ef1 ph\u1eabn n\u1ed9 trong c\u1ed9ng \u0111\u1ed3ng y\u00eau th\u00edch Open Source. ParadeDB, ng\u01b0\u1ee3c l\u1ea1i, l\u00e0 m\u1ed9t d\u1ef1 \u00e1n m\u00e3 ngu\u1ed3n m\u1edf ho\u00e0n to\u00e0n d\u1ef1a tr\u00ean Rust\/Tantivy, cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng t\u1ef1 host v\u00e0 ki\u1ec3m so\u00e1t h\u1ea1 t\u1ea7ng.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Ma tr\u1eadn quy\u1ebft \u0111\u1ecbnh t\u1eeb ZunLiz:<\/strong><\/p>\r\n\r\n<ul>\r\n<li><strong>Ch\u1ecdn GIN:<\/strong> Khi d\u1eef li\u1ec7u nh\u1ecf, y\u00eau c\u1ea7u s\u1ef1 \u1ed5n \u0111\u1ecbnh tuy\u1ec7t \u0111\u1ed1i v\u00e0 kh\u00f4ng mu\u1ed1n ph\u1ee5 thu\u1ed9c v\u00e0o extension b\u00ean th\u1ee9 ba.<\/li>\r\n<li><strong>Ch\u1ecdn ParadeDB:<\/strong> Khi b\u1ea1n c\u1ea7n hi\u1ec7u n\u0103ng cao h\u01a1n GIN, c\u1ea7n BM25, v\u00e0 quan tr\u1ecdng nh\u1ea5t l\u00e0 y\u00eau c\u1ea7u s\u1ef1 t\u1ef1 do (Open Source) \u0111\u1ec3 deploy tr\u00ean On-premise ho\u1eb7c b\u1ea5t k\u1ef3 Cloud n\u00e0o.<\/li>\r\n<li><strong>Ch\u1ecdn TIN:<\/strong> Khi b\u1ea1n l\u00e0 doanh nghi\u1ec7p l\u1edbn, \u01b0u ti\u00ean t\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n v\u00e0 hi\u1ec7u n\u0103ng t\u1ed1i th\u01b0\u1ee3ng, ch\u1ea5p nh\u1eadn m\u00f4 h\u00ecnh Cloud-managed c\u1ee7a PlanetScale.<\/li>\r\n<\/ul>\r\n<!-- \/wp:post-content -->\r\n\r\n<!-- wp:heading -->\r\n<h2>5. H\u01b0\u1edbng D\u1eabn Th\u1ef1c Chi\u1ebfn: C\u00fa Ph\u00e1p Truy V\u1ea5n TIN<\/h2>\r\n<!-- \/wp:heading -->\r\n\r\n<!-- wp:paragraph -->\r\n<p>TIN t\u00edch h\u1ee3p m\u01b0\u1ee3t m\u00e0 v\u00e0o SQL th\u00f4ng qua to\u00e1n t\u1eed <code>==&gt;<\/code>. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 v\u00ed d\u1ee5 v\u1ec1 c\u00e1ch th\u1ef1c hi\u1ec7n m\u1ed9t truy v\u1ea5n t\u00ecm ki\u1ebfm k\u1ebft h\u1ee3p x\u1ebfp h\u1ea1ng BM25:<\/p>\r\n<!-- \/wp:paragraph -->\r\n\r\n<!-- wp:code -->\r\n<pre class=\"wp-block-code\"><code>-- T\u1ea1o index TIN tr\u00ean c\u1ed9t n\u1ed9i dung\r\nCREATE INDEX idx_content_tin ON articles USING tin (content);\r\n\r\n-- Truy v\u1ea5n t\u00ecm ki\u1ebfm v\u1edbi BM25 ranking\r\nSELECT id, title, ts_rank_bm25(content, 'ZunLiz architecture') as score\r\nFROM articles\r\nWHERE content ==&gt; 'ZunLiz &amp; (architecture | database)'\r\nORDER BY score DESC\r\nLIMIT 10;\r\n\r\n-- Phrase query ph\u1ee9c t\u1ea1p\r\nSELECT * FROM articles \r\nWHERE content ==&gt; '\"PostgreSQL internals\" AND \"Full-text search\"';<\/code><\/pre>\r\n<!-- \/wp:code -->\r\n\r\n<!-- wp:heading -->\r\n<h2>K\u1ebft lu\u1eadn: T\u01b0\u01a1ng lai c\u1ee7a PostgreSQL<\/h2>\r\n<!-- \/wp:heading -->\r\n\r\n<!-- wp:paragraph -->\r\n<p>S\u1ef1 xu\u1ea5t hi\u1ec7n c\u1ee7a TIN l\u00e0 minh ch\u1ee9ng cho th\u1ea5y PostgreSQL kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t RDBMS, m\u00e0 \u0111ang tr\u1edf th\u00e0nh m\u1ed9t &#8220;Database Operating System&#8221; c\u00f3 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng sang c\u00e1c mi\u1ec1n d\u1eef li\u1ec7u chuy\u00ean s\u00e2u nh\u01b0 t\u00ecm ki\u1ebfm to\u00e0n v\u0103n. D\u00f9 cu\u1ed9c tranh lu\u1eadn v\u1ec1 Cloud Lock-in v\u1eabn c\u00f2n ti\u1ebfp di\u1ec5n, kh\u00f4ng th\u1ec3 ph\u1ee7 nh\u1eadn r\u1eb1ng PlanetScale \u0111\u00e3 thi\u1ebft l\u1eadp m\u1ed9t ti\u00eau chu\u1ea9n m\u1edbi v\u1ec1 hi\u1ec7u n\u0103ng. \u0110\u1ed1i v\u1edbi c\u00e1c k\u1ef9 s\u01b0 h\u1ec7 th\u1ed1ng, \u0111\u00e2y l\u00e0 th\u1eddi \u0111i\u1ec3m v\u00e0ng \u0111\u1ec3 \u0111\u00e1nh gi\u00e1 l\u1ea1i stack t\u00ecm ki\u1ebfm c\u1ee7a m\u00ecnh.<\/p>\r\n<!-- \/wp:paragraph -->\r\n\r\n<!-- wp:paragraph -->\r\n<p><em>Ngu\u1ed3n tham kh\u1ea3o: PlanetScale Engineering Blog, Hacker News Y Combinator threads on Postgres Extensions, ZunLiz Database Internals Lab.<\/em><\/p>\r\n<!-- \/wp:paragraph -->\r\n\r\n<!-- wp:separator -->\r\n<hr class=\"wp-block-separator\" \/>\r\n<!-- \/wp:separator -->\r\n<div style=\"margin-top: 24px;padding: 16px 20px;border-left: 4px solid #7c5cfc;border-radius: 0 10px 10px 0;font-size: 0.9rem;color: #94a3b8\">\ud83d\udd17 <strong>Ngu\u1ed3n tin th\u1ea3o lu\u1eadn &amp; Tham chi\u1ebfu k\u1ef9 thu\u1eadt:<\/strong> \r\n<a href=\"https:\/\/news.ycombinator.com\/item?id=49766611\" target=\"_blank\" rel=\"nofollow noopener\" style=\"color: #38bdf8;text-decoration: underline\">Hacker News Discussion (Y Combinator #49766611)<\/a> &amp; \r\n<a href=\"https:\/\/planetscale.com\/blog\/introducing-tin\" target=\"_blank\" rel=\"nofollow noopener\" style=\"color: #38bdf8;text-decoration: underline\">PlanetScale Engineering: Introducing TIN<\/a>.<\/div>\r\n","protected":false},"excerpt":{"rendered":"<p>S\u1ef1 ki\u1ec7n PlanetScale c\u00f4ng b\u1ed1 TIN (Text INdex) kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t th\u00f4ng b\u00e1o s\u1ea3n ph\u1ea9m m\u1edbi; \u0111\u00f3 l\u00e0 m\u1ed9t c\u00fa s\u1ed1c ki\u1ebfn tr\u00fac \u0111\u1ed1i v\u1edbi c\u1ed9ng \u0111\u1ed3ng PostgreSQL to\u00e0n c\u1ea7u. V\u1edbi hi\u1ec7u n\u0103ng v\u01b0\u1ee3t tr\u1ed9i g\u1ea5p 25 l\u1ea7n so v\u1edbi ParadeDB v\u00e0 kh\u1ea3 n\u0103ng x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi (concurrency) v\u01b0\u1ee3t xa c\u00e1c gi\u1edbi h\u1ea1n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-116","post","type-post","status-publish","format-standard","hentry","category-cong-nghe-lap-trinh"],"_links":{"self":[{"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":0,"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"wp:attachment":[{"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zunliz.com\/index.php\/wp-json\/wp\/v2\/tags?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}