{"id":2269,"date":"2016-05-19T14:04:20","date_gmt":"2016-05-19T14:04:20","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2269"},"modified":"2025-10-09T07:13:58","modified_gmt":"2025-10-09T14:13:58","slug":"full-text-search-in-net-with-couchbase-4-5","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/","title":{"rendered":"Full Text Search in .NET with Couchbase 4.5"},"content":{"rendered":"<p><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/fts\/full-text-intro.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Full Text Search (or FTS)<\/a> is a new feature that is being released as a developer preview in Couchbase 4.5. It is not meant for production, and is not yet supported, but it is a glimpse at things to come.<\/p>\n<p>When offering the ability to search, a simple <code>LIKE '%foo%'<\/code> with <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/developer-guide\/querying.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">N1QL<\/a> is not enough. Your users expect a richer search experience: one that is language aware and ranks results by their relevance.<\/p>\n<p>In this blog post, I&#8217;m going to show you:<\/p>\n<ul>\n<li>How to set up a Full Text Search index<\/li>\n<li>How to execute a Full Text Search query in the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/admin\/ui-intro.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Console<\/a><\/li>\n<li>How to execute a Full Text Search query with highlighting in ASP.NET<\/li>\n<\/ul>\n<h2>Set up a Full Text Search index<\/h2>\n<p>First, you need to make sure that you are using <a href=\"https:\/\/www.couchbase.com\/nosql-databases\/downloads?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase 4.5 (beta, at least)<\/a>, that you have access to the Couchbase Console, and that your cluster is running a Full Text service. You can check to see if you have a Full Text service running by clicking &#8220;Server Nodes&#8221; in Couchbase Console. Services (like Full Text) have to be enabled\/disabled when adding a node to the cluster. If you need a refresher, check out my <a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-with-windows-and-.net---part-1\/\">blog post on how to install and setup Couchbase on Windows<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/servernodesservices_001.png\" alt=\"Server Nodes - Services available\" \/><\/p>\n<p>I&#8217;m going to setup a full text search index on the <code>`travel-sample`<\/code> sample data bucket. You can install this by going to Settings -&gt; Sample Buckets, selecting &#8216;travel-sample&#8217; and clicking &#8220;Create.&#8221;<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createsamplebucket_002.png\" alt=\"Create a sample bucket\" \/><\/p>\n<p>In this sample data, there are documents of type &#8220;landmark&#8221;. Among other things, these documents contain &#8216;content&#8217; fields. Here&#8217;s a snippet from one of the landmark documents. (ID &#8216;landmark_16079&#8217; if you&#8217;re following along):<\/p>\n<pre><code>{\r\n  \"title\": \"London\/City of London\",\r\n  \"name\": \"20 Fenchurch Street\",\r\n  \"content\": \"The unusual \"walkie talkie\" profile of this under-construction skyscraper by Rafael Vinoly has seen it grab the headlines.\",\r\n  \"type\": \"landmark\"\r\n}\r\n<\/code><\/pre>\n<p>With that structure in mind, let&#8217;s create the index. Go to Indexes-&gt;Full Text, and click &#8220;New Full Text Index&#8221;.<\/p>\n<p>I&#8217;m going to name the index <code>travel-sample-idx<\/code>, and put it on the <code>travel-sample<\/code> bucket. There are a lot of options here, but I&#8217;m just going to cover type mappings. Expand &#8220;Type Mappings&#8221;, and click &#8220;Add Type Mapping&#8221;. This allows you to restrict the full text search to documents of a certain type (in this case, &#8220;landmark&#8221;, which is matched to the &#8220;type&#8221; field). Also check the &#8220;only index specified fields&#8221; box, otherwise all the fields in the documents will be indexed for search. Hit &#8220;ok&#8221;.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createfulltextsearchforlandmark_003.png\" alt=\"Create full text search for landmark documents\" \/><\/p>\n<p>Next, hover over the &#8216;landmark&#8217; type mapping, click the <code>+<\/code> symbol, and click &#8216;insert child field&#8217;. If you want to index search data that&#8217;s further down in the hierarchy of your document, then you would need to &#8216;insert child mapping&#8217; (as many levels as it takes) until you get down to it. In our case, the content field is at the root level, so I don&#8217;t need to do that.<\/p>\n<p>For the child field, enter the field name (&#8220;content&#8221;) in field, leave everything else as-is, and check the &#8220;store&#8221; checkbox (more on that later), and hit &#8220;ok.&#8221;<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createfulltextsearchforlandmarkcontentfield_004.png\" alt=\"Create child field for full text search\" \/><\/p>\n<p>Finally, edit the &#8220;default&#8221; type mapping and uncheck the &#8220;enabled&#8221; option. This mapping would enable searching across all documents, but in this example we want to limit to just landmark. Hit &#8220;ok&#8221;, and &#8220;Create Index&#8221;.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createfulltextsearchdisabledefault_005.png\" alt=\"Disable default type mapping on full text search\" \/><\/p>\n<p>After you hit &#8220;Create Index&#8221;, you&#8217;ll be shown an overview of the index you just created. It will immediately start indexing documents. If you click the <code>Refresh<\/code> button, you&#8217;ll be shown the count of the documents that have been indexed so far.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createfulltextindexing1_005.png\" alt=\"Full Text Search indexing in progress\" \/><\/p>\n<p>It will be 100% when it&#8217;s complete.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/createfulltextindexing2_006.png\" alt=\"Full Text Search indexing complete\" \/><\/p>\n<h2>Execute a Full Text Search query in the Couchbase Console<\/h2>\n<p>Before we go into C#\/.NET, you can try the full text search right from the console. Go to Indexes-&gt;Full Text, and select the full text index that you just created. Enter a search term (if you&#8217;re using the travel sample, &#8220;inn&#8221;, &#8220;skyscraper&#8221;, or &#8220;bed and breakfast&#8221; are good terms to try.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/usingthefulltextsearch_007.png\" alt=\"Using the full text search\" \/><\/p>\n<p>When you click search, you&#8217;ll be given a page of search results (document ID and a fragment of content) in order of their relevance score. Notice that the search terms are highlighted in the content fragment. Enabling &#8220;store&#8221; on the child field makes this work. If you don&#8217;t enable store, you&#8217;ll still get the document results in relevant order, but you won&#8217;t get the highlighted content fragment.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/fulltextsearchresults_008.png\" alt=\"Full Text Search results in Couchbase Console\" \/><\/p>\n<p>Note that the full text search uses <a href=\"https:\/\/www.blevesearch.com\/docs\/Query-String-Query\/\">Bleve<\/a>, and allows you to do more complex searches (exact phrases, boolean queries, etc). Try searching <code>\"bed and breakfast\"<\/code> or <code>bed -breakfast<\/code>, for instance, and see what happens.<\/p>\n<h2>Full Text Search query with highlighting in ASP.NET<\/h2>\n<p>Once you are satisfied with a full text search index that you&#8217;ve created, it&#8217;s time to take it out of the Couchbase Console and into a real application. I&#8217;ve created an example in ASP.NET that demonstrates how to use the Couchbase .NET SDK to perform a full text search. For this example, I&#8217;m assuming that you&#8217;re comfortable with ASP.NET MVC and with the basics of integrating ASP.NET with Couchbase. If that&#8217;s not the case, I recommend that you review the <a>ASP.NET &#8220;Hello World&#8221; example that I blogged about previously<\/a>.<\/p>\n<p>I&#8217;ve created two actions: Index and Search. The Index action shows a view that allows a user to type in a search string. Here&#8217;s the controller and action:<\/p>\n<pre><code>public class HomeController : Controller\r\n{\r\n    private readonly IBucket _bucket;\r\n\r\n    public HomeController(IBucket bucket)\r\n    {\r\n        _bucket = bucket;\r\n    }\r\n\r\n    public ViewResult Index()\r\n    {\r\n        return View();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>And here&#8217;s the view in Index.cshtml:<\/p>\n<pre><code>\r\n<h1>Search<\/h1>\r\n@using (Html.BeginForm(\"Search\", \"Home\"))\r\n    {\r\n        @Html.TextBox(\"q\",\"\")\r\n        \r\n    }\r\n<\/code><\/pre>\n<p>It&#8217;s not pretty, but it&#8217;s functional. Next, I created a Search action. This action will take in the search query and output the results from Couchbase. The results will look very similar to what we saw in Couchbase Console: document ID, relevance score, and highlighted fragments.<\/p>\n<p>There are three steps to executing a full text search:<\/p>\n<ol>\n<li>Instantiate some object that implements <code>ISearchQuery<\/code>. There are many options; I&#8217;m using <code>MatchQuery<\/code> for this example.<\/li>\n<li>Instantiate a SearchParams object to specify search options.<\/li>\n<li>Use an <code>IBucket<\/code> to execute the query+parameters and get results.<\/li>\n<\/ol>\n<p>In this example, I&#8217;ve done all three steps right in the Search action:<\/p>\n<pre><code>public ActionResult Search(string q)\r\n{\r\n    if (string.IsNullOrEmpty(q))\r\n        return View(\"Index\");\r\n\r\n    var query = new MatchQuery(q);\r\n    var searchParams = new SearchParams()\r\n        .Limit(10)\r\n        .Timeout(TimeSpan.FromMilliseconds(10000))\r\n        .Highlighting(HighLightStyle.Html);\r\n    var results = _bucket.Query(\"travel-sample-idx\", query, searchParams);\r\n\r\n    var searchResultsModel = new SearchResultsModel(q, results);\r\n\r\n    return View(searchResultsModel);\r\n}\r\n<\/code><\/pre>\n<p>Some notes on the SearchParams:<\/p>\n<ul>\n<li>I&#8217;m limiting it to the first 10. There is also a Skip() method that you can use for paging.<\/li>\n<li>I&#8217;m setting a timeout of 10000ms. If I create the index correctly, the results will be returned very quickly, but if I tinker with the index and something goes wrong, I want the search to fail quickly.<\/li>\n<li>I&#8217;m setting the highlight style to HTML. This will put the <code><mark><\/mark><\/code> tag around the highlighted search terms in the fragment results.<\/li>\n<\/ul>\n<p>I&#8217;ve also created a <code>SearchResultsModel<\/code> view model. This does the mapping that I need to get the document ID, score, fragments from the search results (as well as the keywords that the user typed in).<\/p>\n<pre><code>public class SearchResultsModel\r\n{\r\n    public List Results { get; private set; }\r\n    public string Keywords { get; private set; }\r\n\r\n    public SearchResultsModel(string keywords, ISearchQueryResult results = null)\r\n    {\r\n        Keywords = keywords;\r\n        Results = results == null\r\n            ? new List() \r\n            : results.Hits.Select(r =&gt; new SearchResultModel(r)).ToList();\r\n    }\r\n\r\n}\r\n\r\npublic class SearchResultModel\r\n{\r\n    public string DocumentId { get; private set; }\r\n    public double Score { get; private set; }\r\n    public List Fragments { get; set; }\r\n\r\n    public SearchResultModel(ISearchQueryRow searchQueryRow)\r\n    {\r\n        DocumentId = searchQueryRow.Id;\r\n        Score = searchQueryRow.Score;\r\n        Fragments = searchQueryRow.Fragments.SelectMany(f =&gt; f.Value).ToList();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Finally, here&#8217;s the Search.cshtml view:<\/p>\n<pre><code>@model FullTextSearchExample.Models.SearchResultsModel\r\n<h1>Search<\/h1>\r\n@using (Html.BeginForm(\"Search\", \"Home\"))\r\n{\r\n    @Html.TextBox(\"q\", Model.Keywords)\r\n    \r\n}\r\n\r\n@if (!Model.Results.Any())\r\n{\r\n    No results found\r\n}\r\nelse\r\n{\r\n    foreach (var result in Model.Results)\r\n    {\r\n\t<h2>Document: @result.DocumentId<\/h2>\r\n\t<h3>Score: @result.Score<\/h3>\r\n\tforeach (var fragment in result.Fragments)\r\n              {\r\n\t\t@Html.Raw(fragment)\r\n\t      }\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Not a terribly pretty HTML page, but it&#8217;s functional. Here&#8217;s what it looks like in action:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/may\/full-text-search-in-.net-with-couchbase-4.5\/fulltextsearchresultsaspnet_009.png\" alt=\"Full Text Search results in ASP.NET\" \/><\/p>\n<h2>Conclusion<\/h2>\n<p>Remember that this feature is just a developer preview: it&#8217;s not supported yet and it&#8217;s not recommended for production yet. But full text search is coming to Couchbase. In fact, you can have a say in how the feature is implemented. Check out the <a href=\"https:\/\/github.com\/couchbaselabs\/sdk-rfcs\/pull\/30\">Full Text Search RFC on GitHub<\/a>, and feel free to ask questions or leave feedback.<\/p>\n<p>Still have questions? Need help with anything? Leave a comment, <a href=\"https:\/\/twitter.com\/mgroves\">ping me on Twitter<\/a>, or email me (matthew.groves AT couchbase DOT com).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Full Text Search (or FTS) is a new feature that is being released as a developer preview in Couchbase 4.5. It is not meant for production, and is not yet supported, but it is a glimpse at things to come. [&hellip;]<\/p>\n","protected":false},"author":71,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10126,1816,2165],"tags":[],"ppma_author":[8937],"class_list":["post-2269","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-asp-dotnet","category-couchbase-server","category-full-text-search"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Full Text Search in .NET with Couchbase 4.5 - 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\/full-text-search-in-net-with-couchbase-4-5\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Full Text Search in .NET with Couchbase 4.5\" \/>\n<meta property=\"og:description\" content=\"Full Text Search (or FTS) is a new feature that is being released as a developer preview in Couchbase 4.5. It is not meant for production, and is not yet supported, but it is a glimpse at things to come. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-19T14:04:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:13:58+00:00\" \/>\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=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Full Text Search in .NET with Couchbase 4.5\",\"datePublished\":\"2016-05-19T14:04:20+00:00\",\"dateModified\":\"2025-10-09T14:13:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\"},\"wordCount\":1219,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\".NET\",\"ASP.NET\",\"Couchbase Server\",\"Full-Text Search\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\",\"name\":\"Full Text Search in .NET with Couchbase 4.5 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-19T14:04:20+00:00\",\"dateModified\":\"2025-10-09T14:13:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Full Text Search in .NET with Couchbase 4.5\"}]},{\"@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":"Full Text Search in .NET with Couchbase 4.5 - 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\/full-text-search-in-net-with-couchbase-4-5\/","og_locale":"en_US","og_type":"article","og_title":"Full Text Search in .NET with Couchbase 4.5","og_description":"Full Text Search (or FTS) is a new feature that is being released as a developer preview in Couchbase 4.5. It is not meant for production, and is not yet supported, but it is a glimpse at things to come. [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-19T14:04:20+00:00","article_modified_time":"2025-10-09T14:13:58+00:00","author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Full Text Search in .NET with Couchbase 4.5","datePublished":"2016-05-19T14:04:20+00:00","dateModified":"2025-10-09T14:13:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/"},"wordCount":1219,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":[".NET","ASP.NET","Couchbase Server","Full-Text Search"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/","url":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/","name":"Full Text Search in .NET with Couchbase 4.5 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-19T14:04:20+00:00","dateModified":"2025-10-09T14:13:58+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Full Text Search in .NET with Couchbase 4.5"}]},{"@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\/2269","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=2269"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2269\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=2269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2269"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}