{"id":16720,"date":"2024-12-25T01:00:40","date_gmt":"2024-12-25T09:00:40","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16720"},"modified":"2025-06-13T23:00:07","modified_gmt":"2025-06-14T06:00:07","slug":"single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/","title":{"rendered":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">There are use cases that are best served by multiple types of data access, including SQL, vector search, geospatial queries, and key-value access. One approach is to combine\/chain together multiple data systems for each access method. However, the <\/span><a href=\"https:\/\/cloud.couchbase.com\/sign-up\"><span style=\"font-weight: 400;\">Couchbase approach<\/span><\/a><span style=\"font-weight: 400;\"> makes it possible to combine these different types of queries to solve real-world problems.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This article walks through aspects of the demo application &#8220;What is This Thing?&#8221; (aka &#8220;WITT&#8221;). For more context and background, check out:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/mgroves\/WhatIsThisThing\"><span style=\"font-weight: 400;\">GitHub Repository for &#8220;What is This Thing?&#8221;<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/www.youtube.com\/watch?v=sYy0ob2GqUo\"><span style=\"font-weight: 400;\">Short overview video of &#8220;What is This Thing?&#8221;<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><i><span style=\"font-weight: 400;\">This blog post is part of the <\/span><\/i><a href=\"https:\/\/csadvent.christmas\/\"><i><span style=\"font-weight: 400;\">2024 C# Advent<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">. However, you don\u2019t need to understand C# to read this post: the concepts are applicable to any of the <\/span><\/i><a href=\"https:\/\/docs.couchbase.com\/home\/sdk.html\"><i><span style=\"font-weight: 400;\">many SDKs available for Couchbase<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">.<\/span><\/i><\/p>\n<h2>Vector Search: The Basics<\/h2>\n<p><span style=\"font-weight: 400;\">Vector search is useful for applications that need to find similar items. For example, embeddings created by AI models can be indexed and searched. Each item in WITT is modeled like this:<\/span><\/p>\n<pre class=\"nums:false lang:yaml decode:true \">{\r\n\u00a0 \"name\": \"Reticulated Splines\",\r\n\u00a0 \"desc\": \"Specialized grooves used in advanced machinery for precise alignment.\",\r\n\u00a0 \"price\": 19.99,\r\n\u00a0 \"image\": \"data:image\/png;base64,...\",\r\n\u00a0 \"rating\": 5,\r\n\u00a0 \"imageVector\": [ -4.5390625, 0.32543945, ... ]\r\n}<\/pre>\n<p><i><span style=\"font-weight: 400;\">Note: The <\/span><\/i><i><span style=\"font-weight: 400;\">image<\/span><\/i><i><span style=\"font-weight: 400;\"> of the item is stored as a base64-encoded string. In a production project, I\u2019d recommend using file storage, S3, etc, rather than storing it in the database.<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\"><code>imageVector<\/code><\/span><span style=\"font-weight: 400;\"> is retrieved by uploading the image to an AI image model, like <\/span><a href=\"https:\/\/azure.microsoft.com\/en-us\/products\/ai-services\/ai-vision\/\"><span style=\"font-weight: 400;\">Azure Computer Vision<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16721\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-3.png\" alt=\"\" width=\"916\" height=\"663\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-3.png 916w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-3-300x217.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image1-3-768x556.png 768w\" sizes=\"auto, (max-width: 916px) 100vw, 916px\" \/><\/a><\/p>\n<p><i><span style=\"font-weight: 400;\">Note: One of the features of the just-announced <\/span><\/i><a href=\"https:\/\/www.couchbase.com\/products\/ai-services\/\"><i><span style=\"font-weight: 400;\">Capella AI services<\/span><\/i><\/a><i><span style=\"font-weight: 400;\"> is model hosting, which will reduce the latency of this step, and also increase privacy and flexibility, and potentially reduce costs.<\/span><\/i><\/p>\n<h2>Image Embeddings and Nearest Neighbor Search<\/h2>\n<p><span style=\"font-weight: 400;\">With a vector search index on the <\/span><span style=\"font-weight: 400;\">imageVector<\/span><span style=\"font-weight: 400;\"> field, Couchbase can perform nearest neighbor searches. In this case, that search would find items that are visually similar (according to the AI model). So, if a user has an image, and they want to find an item in Couchbase that is most similar to that image, a vector search index can do this:<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16722\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-2.png\" alt=\"\" width=\"747\" height=\"703\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-2.png 747w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image2-2-300x282.png 300w\" sizes=\"auto, (max-width: 747px) 100vw, 747px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Here\u2019s the code in WITT that, for a given image, <\/span><a href=\"https:\/\/github.com\/mgroves\/WhatIsThisThing\/blob\/main\/WhatIsThisThing.Core\/Services\/AzureEmbeddingService.cs\"><span style=\"font-weight: 400;\">requests a vector embedding<\/span><\/a><span style=\"font-weight: 400;\"> from Azure Computer Vision:<\/span><\/p>\n<pre class=\"nums:false lang:c# decode:true \">\/\/ Free tier: 20 Calls per minute, 5K Calls per month\r\n\/\/ Standard tier: 10 Calls per second, starting $1.00 USD\/1000 calls (Estimated)\r\npublic async Task&lt;float[]&gt; GetImageEmbedding(string base64Image)\r\n{\r\n\u00a0 \u00a0 var endpoint = _settings.Value.Endpoint;\r\n\u00a0 \u00a0 var subscriptionKey = _settings.Value.SubscriptionKey;\r\n\r\n\u00a0 \u00a0 using (HttpClient client = new HttpClient())\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Set the subscription key and endpoint\r\n\u00a0 \u00a0 \u00a0 \u00a0 client.DefaultRequestHeaders.Add(\"Ocp-Apim-Subscription-Key\", subscriptionKey);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Endpoint URL\r\n\u00a0 \u00a0 \u00a0 \u00a0 string url = $\"{endpoint}\/retrieval:vectorizeImage?overload=stream&amp;api-version=2023-04-01-preview\";\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 byte[] imageBytes = Base64PngToByteArray(base64Image);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 using (ByteArrayContent content = new ByteArrayContent(imageBytes))\r\n\u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 content.Headers.ContentType = new MediaTypeHeaderValue(\"application\/octet-stream\");\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 HttpResponseMessage response = await client.PostAsync(url, content);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 string jsonResponse = await response.Content.ReadAsStringAsync();\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (response.IsSuccessStatusCode)\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ Parse the JSON response to extract the vector embeddings\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 JObject json = JObject.Parse(jsonResponse);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 JToken vectorEmbeddings = json[\"vector\"];\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return vectorEmbeddings.ToObject&lt;float[]&gt;();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 throw new Exception(\"Unable to retrieve vector embeddings for image.\");\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">There are probably frameworks that can handle this call too, but for this simple demo, that only requires a single REST call, I found this to be sufficient. If you want to use something other than Azure with this demo, you need to implement <\/span><span style=\"font-weight: 400;\"><code>IEmbeddingService<\/code><\/span><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2>Multi-Purpose Queries with SQL++<\/h2>\n<p><span style=\"font-weight: 400;\">Many databases with vector search can perform a very similar operation. What Couchbase enables you to do is to perform multiple types of data operations with a single platform, a single pool of data. For instance, given a geospatial location (which can be retrieved through a web browser), you can not only query to find a similar item by image, but also combine that with a geospatial search, all through a single SQL++ query:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true \">WITH closestStores AS (\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \r\n\u00a0 \u00a0 \/* CTE to get closest stores based on user's location *\/\r\n\u00a0 \u00a0 SELECT x.name, META(x).id AS id\r\n\u00a0 \u00a0 FROM whatisthis._default.Stores x\r\n\u00a0 \u00a0 WHERE SEARCH(x, {\r\n\u00a0 \u00a0 \u00a0 \"fields\": [\"*\"],\r\n\u00a0 \u00a0 \u00a0 \"query\" : {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"location\" : {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"lat\" : 39.8787,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"lon\" : -83.0805\r\n\u00a0 \u00a0 \u00a0 \u00a0 },\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"distance\" : \"15mi\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"field\" : \"geo\"\r\n\u00a0 \u00a0 \u00a0 } . . .\r\n\u00a0 })\r\n\r\n\u00a0 LIMIT 3\r\n)\r\n\/* SELECT items with nearby stock *\/\r\nSELECT allItems.name, allItems.`desc`, allItems.image, allItems.price, allItems.rating, SEARCH_SCORE(allItems) AS score,\r\n\r\n\u00a0 \u00a0 \/* subquery to get stock from nearby locations *\/\r\n\u00a0 \u00a0 (SELECT . . . ) AS stock\r\n\r\nFROM whatisthis._default.Items AS allItems\r\n\r\n\/* vector search using image embedding *\/\r\nWHERE SEARCH(allItems,\r\n\u00a0 {\r\n\u00a0 \u00a0 \"fields\": [\"*\"],\r\n\u00a0 \u00a0 \"query\": { \"match_none\": {} },\r\n\u00a0 \u00a0 \"knn\": [\r\n\u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"k\": 4,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"field\": \"imageVector\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"vector\": [ -0.9135742,1.1552734, ... ]\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 ]\r\n\u00a0 }\r\n)\r\nORDER BY score DESC<\/pre>\n<p><i><span style=\"font-weight: 400;\">Note: this query was edited for brevity\u2019s sake. Check out <\/span><\/i><a href=\"https:\/\/github.com\/mgroves\/WhatIsThisThing\/blob\/main\/WhatIsThisThing.Core\/Services\/DataLayer.cs\"><i><span style=\"font-weight: 400;\">DataLayer.cs<\/span><\/i><\/a><i><span style=\"font-weight: 400;\"> for a more complete view of the queries.<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">The result of this query is a &#8220;most likely match&#8221; for a given image. For example, here is the top result when uploading a picture of a pen:<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16723\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3.jpg\" alt=\"\" width=\"469\" height=\"743\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3.jpg 469w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-189x300.jpg 189w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/image3-300x475.jpg 300w\" sizes=\"auto, (max-width: 469px) 100vw, 469px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">The quality of matches will depend on:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The quality of the AI model<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The quality\/quantity of the images for a given item<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">In my limited testing, I\u2019ve found the Azure Computer Vision model to be very good for matching relevant images.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The result also will contain nearby stores, where the item is available for purchase.<\/span><\/p>\n<h2>Beyond Vector Search and Geospatial<\/h2>\n<p><span style=\"font-weight: 400;\">This query showed Couchbase\u2019s ability to combine vector search AND geospatial search into a single operation. It also contained a CTE, JOINs, and a subquery.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Within a single query, you can also perform:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/search\/search.html\"><span style=\"font-weight: 400;\">Full Text Search<\/span><\/a><span style=\"font-weight: 400;\">, including scoring, facets, boosting, etc.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/n1ql\/n1ql-language-reference\/time-series.html\"><span style=\"font-weight: 400;\">Time series<\/span><\/a><span style=\"font-weight: 400;\"> operations<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/n1ql\/n1ql-language-reference\/userfun.html\"><span style=\"font-weight: 400;\">User-defined functions (UDFs)<\/span><\/a><span style=\"font-weight: 400;\"> for adding custom code (JavaScript or SQL)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/n1ql\/query.html\"><span style=\"font-weight: 400;\">Full SQL capabilities<\/span><\/a><span style=\"font-weight: 400;\">: window functions, CTEs, JOINs, aggregation, and more<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Read from real-time analytics data via <\/span><a href=\"https:\/\/docs.couchbase.com\/columnar\/sqlpp\/5_dml_copy_to_kv.html\"><span style=\"font-weight: 400;\">write-back<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Query data that\u2019s automatically synced from <\/span><a href=\"https:\/\/docs.couchbase.com\/home\/mobile.html\"><span style=\"font-weight: 400;\">mobile\/edge devices<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Automatic <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/buckets-memory-and-storage\/memory-and-storage.html\"><span style=\"font-weight: 400;\">caching<\/span><\/a><span style=\"font-weight: 400;\"> (built-in)<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><i><span style=\"font-weight: 400;\">Here\u2019s the marketing section<\/span><\/i><span style=\"font-weight: 400;\">: Some databases may only be able to perform a subset of these operations, and require you to bring in other tools when you need additional functionality. This increases your costs, latency, and complexity. With Couchbase, you can keep your application simpler, faster, and cheaper. <\/span><i><span style=\"font-weight: 400;\">Marketing section over.<\/span><\/i><\/p>\n<h2>Technical Highlights<\/h2>\n<p><span style=\"font-weight: 400;\">The WITT demo application referenced is built with:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">React UI frontend<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">ASP.NET Core backend<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Azure Computer Vision<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Couchbase .NET SDK<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">You can also check out <\/span><a href=\"https:\/\/whatisthisthing.azurewebsites.net\/\"><span style=\"font-weight: 400;\">What is This Thing?<\/span><\/a><span style=\"font-weight: 400;\"> as a public demo. (<\/span><i><span style=\"font-weight: 400;\">Keep in mind that it is all built with free-tier hosting (Azure and <\/span><\/i><a href=\"https:\/\/cloud.couchbase.com\/sign-up\"><i><span style=\"font-weight: 400;\">Capella Free Tier<\/span><\/i><\/a><i><span style=\"font-weight: 400;\">), and that it is still actively being developed. If you notice some slowness or downtime, that could be because of too much traffic, sorry!<\/span><\/i><span style=\"font-weight: 400;\">)<\/span><\/p>\n<p><iframe loading=\"lazy\" title=\"Couchbase Capella vector and hybrid search demo: &quot;What is this thing?&quot;\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/sYy0ob2GqUo?feature=oembed&#038;enablejsapi=1&#038;origin=https:\/\/www.couchbase.com\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>There are use cases that are best served by multiple types of data access, including SQL, vector search, geospatial queries, and key-value access. One approach is to combine\/chain together multiple data systems for each access method. However, the Couchbase approach [&hellip;]<\/p>\n","protected":false},"author":71,"featured_media":16724,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10122,10127,2165,8683,1812,9937],"tags":[9923,9966,9600],"ppma_author":[8937],"class_list":["post-16720","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-artificial-intelligence-ai","category-c-sharp","category-full-text-search","category-geospatial","category-n1ql-query","category-vector-search","tag-embeddings","tag-hybrid-search","tag-multimodel"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"See how Couchbase unites SQL, vector search, and geospatial queries in the &#039;What is This Thing?&#039; demo for seamless AI-driven data access.\" \/>\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\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More\" \/>\n<meta property=\"og:description\" content=\"See how Couchbase unites SQL, vector search, and geospatial queries in the &#039;What is This Thing?&#039; demo for seamless AI-driven data access.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-25T09:00:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:00:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More\",\"datePublished\":\"2024-12-25T09:00:40+00:00\",\"dateModified\":\"2025-06-14T06:00:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\"},\"wordCount\":793,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png\",\"keywords\":[\"embeddings\",\"hybrid search\",\"multimodel\"],\"articleSection\":[\".NET\",\"Artificial Intelligence (AI)\",\"C#\",\"Full-Text Search\",\"Geospatial\",\"SQL++ \/ N1QL Query\",\"Vector Search\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\",\"name\":\"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png\",\"datePublished\":\"2024-12-25T09:00:40+00:00\",\"dateModified\":\"2025-06-14T06:00:07+00:00\",\"description\":\"See how Couchbase unites SQL, vector search, and geospatial queries in the 'What is This Thing?' demo for seamless AI-driven data access.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More - The Couchbase Blog","description":"See how Couchbase unites SQL, vector search, and geospatial queries in the 'What is This Thing?' demo for seamless AI-driven data access.","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\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/","og_locale":"en_US","og_type":"article","og_title":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More","og_description":"See how Couchbase unites SQL, vector search, and geospatial queries in the 'What is This Thing?' demo for seamless AI-driven data access.","og_url":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-12-25T09:00:40+00:00","article_modified_time":"2025-06-14T06:00:07+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png","type":"image\/png"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More","datePublished":"2024-12-25T09:00:40+00:00","dateModified":"2025-06-14T06:00:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/"},"wordCount":793,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png","keywords":["embeddings","hybrid search","multimodel"],"articleSection":[".NET","Artificial Intelligence (AI)","C#","Full-Text Search","Geospatial","SQL++ \/ N1QL Query","Vector Search"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/","url":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/","name":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png","datePublished":"2024-12-25T09:00:40+00:00","dateModified":"2025-06-14T06:00:07+00:00","description":"See how Couchbase unites SQL, vector search, and geospatial queries in the 'What is This Thing?' demo for seamless AI-driven data access.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/12\/blog-couchbase-vector-and-more-.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/single-platform-multi-purpose-couchbase-vector-search-geospatial-sql-more\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Single Platform, Multi-Purpose Couchbase: Vector Search, Geospatial, SQL++, and More"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves is a guy who loves to code.  It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything.  He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s.  He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community.  He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16720","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=16720"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/16720\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/16724"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=16720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=16720"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=16720"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=16720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}