{"id":17865,"date":"2026-02-10T09:15:06","date_gmt":"2026-02-10T17:15:06","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17865"},"modified":"2026-03-31T16:24:37","modified_gmt":"2026-03-31T23:24:37","slug":"filtered-ann-search-with-ive-composite-vector-indexes","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/","title":{"rendered":"Filtered ANN Search With Composite Vector Indexes (Part 3)"},"content":{"rendered":"<p><span style=\"font-weight: 400\">This post is the third part of a multi-part series exploring composite vector indexing in Couchbase. If you missed the previous posts, be sure to catch up on <a href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-composite-vector-indexes\/\">Part 1<\/a> and <a href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-composite-vector-indexes-2\/\">Part 2<\/a>.<\/span><\/p>\n<p style=\"font-weight: 400;padding: 0px !important\">The series will cover:<\/p>\n<ol style=\"padding-bottom: 0px !important\">\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-composite-vector-indexes\/\"><span style=\"font-weight: 400\">Why composite vector indexes matter, including concepts, terminology, and developer motivation. A Smart Grocery Recommendation System will be used as a running example.<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-composite-vector-indexes-2\/\"><span style=\"font-weight: 400\">How composite vector indexes are implemented inside the Couchbase Indexing Service.<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">How ORDER BY pushdown works for composite vector queries.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-composite-vector-indexes-part-4\/\">Real-world performance behavior and benchmarking results<\/a>.<\/span><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Order By Pushdown &#8211; Composite vector indexes<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Let\u2019s imagine a feature in your food or grocery app:<\/span><\/p>\n<p><span style=\"font-weight: 400\">\u201cRecommend chocolate spreads with a Nutella-like taste, ordered by nutritional quality i.e. higher protein first, lower sugar next.\u201d<\/span><\/p>\n<p><span style=\"font-weight: 400\">This is more than simple filtering.<\/span><\/p>\n<p><span style=\"font-weight: 400\">It requires combining:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Semantic similarity (taste\/texture)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Nutritional filtering (sugars &amp; proteins)<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">A custom ordering strategy<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">The corresponding SQL++ query might look like this:<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT product_name\r\nFROM food\r\nWHERE sugars_100g &lt; 20 AND proteins_100g &gt; 10\r\nORDER BY APPROX_VECTOR_DISTANCE(text_vector, [query_embedding], 'L2'),\r\n         proteins_100g DESC,\r\n         sugars_100g ASC\r\nLIMIT 10;<\/pre>\n<p><span style=\"font-weight: 400\">This single query expresses everything we want:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Only healthier chocolate spreads<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Closest in flavor semantics to Nutella<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Higher protein preferred<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Lower sugar next<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Show the user just the top 10<\/span><\/li>\n<\/ul>\n<p>Now let\u2019s dive into how Couchbase executes this extremely efficiently.<\/p>\n<ol style=\"padding-bottom: 0px !important\">\n<li>Scalar Filters Are Pushed Down\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>The scalar predicates are evaluated inline using the Composite Vector Index.\n<ol style=\"padding: 0px !important\" type=\"i\">\n<li><code>sugars_100g &lt; 20<\/code><\/li>\n<li><code>proteins_100g &gt; 10<\/code><\/li>\n<\/ol>\n<\/li>\n<li><code>APPROX_VECTOR_DISTANCE(...)<\/code> activates Couchbase\u2019s ANN (Approximate Nearest Neighbor) scan pipeline.<\/li>\n<li>The vector index locates the items whose embeddings are closest to the query embedding (Nutella in our example).<\/li>\n<li>Refer to part 2 of this blog series for internal working.<\/li>\n<\/ol>\n<\/li>\n<li>LIMIT and ORDER BY Pushdown\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>This is where Couchbase becomes exceptionally efficient.<\/li>\n<li style=\"padding: 0px\">When the query includes:\n<ol style=\"padding: 0px !important\" type=\"i\">\n<li style=\"padding: 0px !importnat\"><code>LIMIT &lt;limit_value&gt;<\/code><\/li>\n<\/ol>\n<\/li>\n<li>Couchbase can push both <code>LIMIT<\/code> and <code>ORDER BY<\/code> into the index service.<\/li>\n<li>This avoids sending large intermediate result sets to the query service.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p style=\"padding: 8px\">Here\u2019s how ORDER BY Pushdown with scalars and ANN works<\/p>\n<ol style=\"padding: 0px !important\">\n<li>Indexer Builds a Concatenated Sort Key\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>While performing the Composite Vector Index scan, the indexer constructs a composite sort key for each candidate item.<\/li>\n<li style=\"padding: 0px !important\">The concatenated composite sort key consists of:\n<ol style=\"padding: 0px !important\" type=\"i\">\n<li style=\"padding: 0px !important\">ANN distance in place of the vector key<\/li>\n<li style=\"padding: 0px !important\">The scalar <code>ORDER BY<\/code> fields in the exact <code>ORDER BY<\/code> sequence:\n<ol style=\"padding: 0px !important\">\n<li style=\"padding: 0px !important\"><code>proteins_100g (DESC)<\/code>\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li style=\"padding: 0px !important;margin-left: 5px\">Negated or encoded for descending order<\/li>\n<\/ol>\n<\/li>\n<li><code>sugars_100g<\/code> (ASC)<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>This yields a lexicographically comparable key like:\n<ol style=\"padding: 0px !important\">\n<li style=\"padding: 0px !important\"><code>(distance, -proteins_100g, sugars_100g)<\/code><\/li>\n<\/ol>\n<\/li>\n<li>Why replace the vector field?\n<ol type=\"i\">\n<li>Because for ordering, the distance becomes the actual scalar value of interest and not the vector itself.<\/li>\n<li>This allows the indexer to sort candidates.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Indexer Maintains Only the Top-K Items\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>As the indexer scans ANN candidates, it keeps a K-sized priority heap (<code>K = LIMIT<\/code>).<\/li>\n<li>Each candidate is evaluated using the concatenated key.<\/li>\n<li>If the heap exceeds size K, the worst item is evicted.<\/li>\n<li>At the end, only the top <code>LIMIT<\/code> items remain.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p style=\"padding: 0px !important\">This means:<\/p>\n<ul style=\"padding-top: 0px !important\">\n<li>No large result sets are produced<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">No full sorting happens on the query node<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">ANN + scalar ranking + LIMIT all happen in one place<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Indexer streams only the top 10 items to the query service<\/span><\/li>\n<\/ul>\n<p style=\"padding: 0px !important\">By the time results reach the query node, they are already:<\/p>\n<ul style=\"padding-bottom: 0px !important\">\n<li style=\"padding-top: 0px !important\">Filtered<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Semantically ordered<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Scalar-ordered<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Trimmed to LIMIT<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">The query node has almost nothing left to do.<\/span><br \/>\n<span style=\"font-weight: 400\">This is the fastest possible execution path in Couchbase for hybrid semantic + scalar ranking.<\/span><\/p>\n<p><span style=\"font-weight: 400\">The Flexibility of Mixing Scalars and Vectors in ORDER BY<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">One of the most powerful aspects of Couchbase\u2019s Composite Vector Index is that developers are not locked into a single ranking strategy.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Unlike many vector databases that force you to sort \u201conly by vector distance,\u201d Couchbase allows you to freely mix, reorder, and permute scalar fields and vector similarity measures inside a single ORDER BY clause.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Below are four meaningful ordering permutations for our Nutella-like food search.<\/span><\/p>\n<ol style=\"padding: 0px !important\">\n<li><span style=\"font-weight: 400\"><span style=\"font-weight: 400\">Semantic-first (Flavor similarity dominates)<br \/>\n<\/span><\/span><\/p>\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>Use case: You want \u201cNutella-like\u201d taste to dominate ranking.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<pre style=\"padding: 0px !important\" class=\"lang:default decode:true\">ORDER BY APPROX_VECTOR_DISTANCE(...),\r\n         proteins_100g DESC,\r\n         sugars_100g ASC\r\nLIMIT 10;\r\n<\/pre>\n<ol style=\"padding: 0px !important\" start=\"2\">\n<li><span style=\"font-weight: 400\"><span style=\"font-weight: 400\">Protein-first (Healthier choices dominate)<br \/>\n<\/span><\/span><\/p>\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>Use case: For fitness-focused applications where nutrition outranks flavor.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<pre class=\"lang:default decode:true \">ORDER BY proteins_100g DESC,\r\n         APPROX_VECTOR_DISTANCE(...),\r\n         sugars_100g ASC\r\nLIMIT 10;<\/pre>\n<ol style=\"padding: 0px !important\" start=\"3\">\n<li>\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li style=\"list-style-type: none\">\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>Use case: Diabetic-friendly search or sugar-reduction diets.<span style=\"font-weight: 400\"><span style=\"font-weight: 400\">Sugar-first (User wants lower sugar above everything else)<\/span><\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<pre class=\"lang:default decode:true\">ORDER BY sugars_100g ASC,\r\n         proteins_100g DESC,\r\n         APPROX_VECTOR_DISTANCE(...)\r\nLIMIT 10;<\/pre>\n<ol style=\"padding: 0px !important\" start=\"4\">\n<li style=\"list-style-type: none\">\n<ol style=\"padding: 0px !important\" start=\"4\">\n<li><span style=\"font-weight: 400\">Complex Hybrid Ranking<\/span>\n<ol style=\"padding: 0px !important\" type=\"a\">\n<li>Use case: Health-first search with semantic fallback and tiebreakers.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<pre class=\"lang:default decode:true\">ORDER BY calories_100g ASC,\r\n         APPROX_VECTOR_DISTANCE(...),\r\n         proteins_100g DESC,\r\n         sugars_100g ASC\r\nLIMIT 10;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Final Takeaway for Developers<\/span><\/p>\n<ol style=\"padding: 0px !important\" start=\"4\">\n<li style=\"list-style-type: none\">\n<ol style=\"padding: 0px !important\" start=\"4\">\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Couchbase combines ANN similarity, scalar filtering, custom ORDER BY, and LIMIT pushdown directly inside the Composite Vector Index.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">This gives you the power to build real-world intelligent search features like Nutella-flavor recommendations optimized for nutrition using a single, fast, elegant SQL++ query.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Couchbase doesn\u2019t just store vectors in the index. It lets you query them efficiently and combine them with structured data all at scale.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>This post is the third part of a multi-part series exploring composite vector indexing in Couchbase. If you missed the previous posts, be sure to catch up on Part 1 and Part 2. The series will cover: Why composite vector [&hellip;]<\/p>\n","protected":false},"author":85690,"featured_media":17866,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9937],"tags":[],"ppma_author":[10168],"class_list":["post-17865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vector-search"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.0 (Yoast SEO v27.0) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Filtered ANN Search With Composite Vector Indexes (Part 3) - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filtered ANN Search With Composite Vector Indexes (Part 3)\" \/>\n<meta property=\"og:description\" content=\"This post is the third part of a multi-part series exploring composite vector indexing in Couchbase. If you missed the previous posts, be sure to catch up on Part 1 and Part 2. The series will cover: Why composite vector [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-10T17:15:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-31T23:24:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes-1024x536.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sai Kommaraju, Senior Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sai Kommaraju, Senior Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\"},\"author\":{\"name\":\"Sai Kommaraju, Senior Software Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8fb575d74280ff3d0f044904277a8076\"},\"headline\":\"Filtered ANN Search With Composite Vector Indexes (Part 3)\",\"datePublished\":\"2026-02-10T17:15:06+00:00\",\"dateModified\":\"2026-03-31T23:24:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\"},\"wordCount\":713,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png\",\"articleSection\":[\"Vector Search\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\",\"name\":\"Filtered ANN Search With Composite Vector Indexes (Part 3) - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png\",\"datePublished\":\"2026-02-10T17:15:06+00:00\",\"dateModified\":\"2026-03-31T23:24:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Filtered ANN Search With Composite Vector Indexes (Part 3)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8fb575d74280ff3d0f044904277a8076\",\"name\":\"Sai Kommaraju, Senior Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a2ca26c70968f44d876aa239d293a709\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg\",\"caption\":\"Sai Kommaraju, Senior Software Engineer\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/saikommaraju\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Filtered ANN Search With Composite Vector Indexes (Part 3) - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/","og_locale":"en_US","og_type":"article","og_title":"Filtered ANN Search With Composite Vector Indexes (Part 3)","og_description":"This post is the third part of a multi-part series exploring composite vector indexing in Couchbase. If you missed the previous posts, be sure to catch up on Part 1 and Part 2. The series will cover: Why composite vector [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/","og_site_name":"The Couchbase Blog","article_published_time":"2026-02-10T17:15:06+00:00","article_modified_time":"2026-03-31T23:24:37+00:00","og_image":[{"width":1024,"height":536,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes-1024x536.png","type":"image\/png"}],"author":"Sai Kommaraju, Senior Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Sai Kommaraju, Senior Software Engineer","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/"},"author":{"name":"Sai Kommaraju, Senior Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8fb575d74280ff3d0f044904277a8076"},"headline":"Filtered ANN Search With Composite Vector Indexes (Part 3)","datePublished":"2026-02-10T17:15:06+00:00","dateModified":"2026-03-31T23:24:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/"},"wordCount":713,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png","articleSection":["Vector Search"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/","url":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/","name":"Filtered ANN Search With Composite Vector Indexes (Part 3) - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png","datePublished":"2026-02-10T17:15:06+00:00","dateModified":"2026-03-31T23:24:37+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/02\/Filtered-ANN-Search-with-Composite-Vector-Indexes.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/filtered-ann-search-with-ive-composite-vector-indexes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Filtered ANN Search With Composite Vector Indexes (Part 3)"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8fb575d74280ff3d0f044904277a8076","name":"Sai Kommaraju, Senior Software Engineer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a2ca26c70968f44d876aa239d293a709","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg","caption":"Sai Kommaraju, Senior Software Engineer"},"url":"https:\/\/www.couchbase.com\/blog\/author\/saikommaraju\/"}]}},"authors":[{"term_id":10168,"user_id":85690,"is_guest":0,"slug":"saikommaraju","display_name":"Sai Kommaraju, Senior Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2026\/01\/Sai-Kommaraju.jpeg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/17865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/85690"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=17865"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/17865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/17866"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=17865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=17865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=17865"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=17865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}