{"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\/pt\/full-text-search-in-net-with-couchbase-4-5\/","title":{"rendered":"Pesquisa de texto completo em .NET com o 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\">Pesquisa de texto completo (ou FTS)<\/a> \u00e9 um novo recurso que est\u00e1 sendo lan\u00e7ado como uma pr\u00e9via para desenvolvedores no Couchbase 4.5. Ele n\u00e3o se destina \u00e0 produ\u00e7\u00e3o e ainda n\u00e3o \u00e9 compat\u00edvel, mas \u00e9 um vislumbre do que est\u00e1 por vir.<\/p>\n<p>Ao oferecer a capacidade de pesquisa, um simples <code>LIKE '%foo%'<\/code> com <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> n\u00e3o \u00e9 suficiente. Seus usu\u00e1rios esperam uma experi\u00eancia de pesquisa mais rica: uma experi\u00eancia que reconhe\u00e7a o idioma e classifique os resultados de acordo com sua relev\u00e2ncia.<\/p>\n<p>Nesta postagem do blog, vou mostrar a voc\u00ea:<\/p>\n<ul>\n<li>Como configurar um \u00edndice de pesquisa de texto completo<\/li>\n<li>Como executar uma consulta de pesquisa de texto completo no <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\">Console do Couchbase<\/a><\/li>\n<li>Como executar uma consulta de pesquisa de texto completo com destaque no ASP.NET<\/li>\n<\/ul>\n<h2>Configurar um \u00edndice de pesquisa de texto completo<\/h2>\n<p>Primeiro, voc\u00ea precisa ter certeza de que est\u00e1 usando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/nosql-databases\/downloads\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase 4.5 (beta, pelo menos)<\/a>Verifique se voc\u00ea tem acesso ao Console do Couchbase e se o seu cluster est\u00e1 executando um servi\u00e7o de texto completo. Voc\u00ea pode verificar se h\u00e1 um servi\u00e7o Full Text em execu\u00e7\u00e3o clicando em \"Server Nodes\" (N\u00f3s do servidor) no Console do Couchbase. Os servi\u00e7os (como o Full Text) precisam ser ativados\/desativados ao adicionar um n\u00f3 ao cluster. Se precisar de uma atualiza\u00e7\u00e3o, d\u00ea uma olhada no meu <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-with-windows-and-.net---part-1\/\">postagem do blog sobre como instalar e configurar o Couchbase no 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>Vou configurar um \u00edndice de pesquisa de texto completo no <code>`amostra de viagem`<\/code> bucket de dados de amostra. Voc\u00ea pode instal\u00e1-lo acessando Settings -&gt; Sample Buckets, selecionando 'travel-sample' e clicando em \"Create\".<\/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>Nesses dados de amostra, h\u00e1 documentos do tipo \"landmark\". Entre outras coisas, esses documentos cont\u00eam campos de \"conte\u00fado\". Aqui est\u00e1 um trecho de um dos documentos de refer\u00eancia. (ID 'landmark_16079' se estiver acompanhando):<\/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>Com essa estrutura em mente, vamos criar o \u00edndice. V\u00e1 para Indexes-&gt;Full Text (\u00cdndices-&gt;Texto completo) e clique em \"New Full Text Index\" (Novo \u00edndice de texto completo).<\/p>\n<p>Vou nomear o \u00edndice <code>amostra de viagem-idx<\/code>e coloc\u00e1-lo no <code>amostra de viagem<\/code> balde. H\u00e1 muitas op\u00e7\u00f5es aqui, mas vou abordar apenas os mapeamentos de tipos. Expanda \"Type Mappings\" (Mapeamentos de tipos) e clique em \"Add Type Mapping\" (Adicionar mapeamento de tipos). Isso permite que voc\u00ea restrinja a pesquisa de texto completo a documentos de um determinado tipo (neste caso, \"landmark\", que corresponde ao campo \"type\"). Marque tamb\u00e9m a caixa \"only index specified fields\" (indexar somente os campos especificados); caso contr\u00e1rio, todos os campos dos documentos ser\u00e3o indexados para pesquisa. Pressione \"ok\".<\/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>Em seguida, passe o mouse sobre o mapeamento do tipo 'landmark' e clique no \u00edcone <code>+<\/code> e clique em \"inserir campo filho\". Se voc\u00ea quiser indexar dados de pesquisa que estejam mais abaixo na hierarquia do documento, precisar\u00e1 \"inserir mapeamento filho\" (quantos n\u00edveis forem necess\u00e1rios) at\u00e9 chegar a eles. No nosso caso, o campo de conte\u00fado est\u00e1 no n\u00edvel da raiz, portanto, n\u00e3o preciso fazer isso.<\/p>\n<p>Para o campo filho, digite o nome do campo (\"content\") no campo, deixe todo o resto como est\u00e1, marque a caixa de sele\u00e7\u00e3o \"store\" (mais sobre isso adiante) e clique em \"ok\".<\/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>Por fim, edite o mapeamento do tipo \"default\" e desmarque a op\u00e7\u00e3o \"enabled\". Esse mapeamento permitiria a pesquisa em todos os documentos, mas, neste exemplo, queremos limitar apenas ao marco. Pressione \"ok\" e \"Create Index\".<\/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>Depois de clicar em \"Create Index\", voc\u00ea ver\u00e1 uma vis\u00e3o geral do \u00edndice que acabou de criar. Ele come\u00e7ar\u00e1 imediatamente a indexar os documentos. Se voc\u00ea clicar no \u00edcone <code>Atualizar<\/code> voc\u00ea ver\u00e1 a contagem dos documentos que foram indexados at\u00e9 o momento.<\/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>Ele ser\u00e1 100% quando estiver conclu\u00eddo.<\/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>Executar uma consulta de pesquisa de texto completo no Console do Couchbase<\/h2>\n<p>Antes de entrarmos no C#\/.NET, voc\u00ea pode experimentar a pesquisa de texto completo diretamente no console. V\u00e1 para Indexes-&gt;Full Text (\u00cdndices-&gt;Texto completo) e selecione o \u00edndice de texto completo que voc\u00ea acabou de criar. Digite um termo de pesquisa (se estiver usando a amostra de viagem, \"inn\" (pousada), \"skyscraper\" (arranha-c\u00e9u) ou \"bed and breakfast\" (cama e caf\u00e9 da manh\u00e3) s\u00e3o bons termos para tentar).<\/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>Ao clicar em pesquisar, voc\u00ea receber\u00e1 uma p\u00e1gina de resultados de pesquisa (ID do documento e um fragmento de conte\u00fado) em ordem de pontua\u00e7\u00e3o de relev\u00e2ncia. Observe que os termos de pesquisa s\u00e3o destacados no fragmento de conte\u00fado. A ativa\u00e7\u00e3o de \"store\" no campo filho faz com que isso funcione. Se voc\u00ea n\u00e3o ativar o armazenamento, ainda obter\u00e1 os resultados do documento em ordem de relev\u00e2ncia, mas n\u00e3o obter\u00e1 o fragmento de conte\u00fado destacado.<\/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>Observe que a pesquisa de texto completo usa <a href=\"https:\/\/www.blevesearch.com\/docs\/Query-String-Query\/\">Bleve<\/a>e permite que voc\u00ea fa\u00e7a pesquisas mais complexas (frases exatas, consultas booleanas, etc.). Tente pesquisar <code>\"cama e caf\u00e9 da manh\u00e3\"<\/code> ou <code>caf\u00e9 da manh\u00e3<\/code>por exemplo, e veja o que acontece.<\/p>\n<h2>Consulta de pesquisa de texto completo com destaque no ASP.NET<\/h2>\n<p>Quando estiver satisfeito com o \u00edndice de pesquisa de texto completo que voc\u00ea criou, \u00e9 hora de tir\u00e1-lo do Console do Couchbase e coloc\u00e1-lo em um aplicativo real. Criei um exemplo em ASP.NET que demonstra como usar o SDK do Couchbase .NET para executar uma pesquisa de texto completo. Para este exemplo, presumo que voc\u00ea esteja familiarizado com o ASP.NET MVC e com os princ\u00edpios b\u00e1sicos da integra\u00e7\u00e3o do ASP.NET com o Couchbase. Se esse n\u00e3o for o caso, recomendo que voc\u00ea leia o artigo <a>Exemplo do ASP.NET \"Hello World\" sobre o qual escrevi no blog anteriormente<\/a>.<\/p>\n<p>Criei duas a\u00e7\u00f5es: Index e Search. A a\u00e7\u00e3o Index mostra uma exibi\u00e7\u00e3o que permite que um usu\u00e1rio digite uma string de pesquisa. Aqui est\u00e3o o controlador e a a\u00e7\u00e3o:<\/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>E aqui est\u00e1 a exibi\u00e7\u00e3o em Index.cshtml:<\/p>\n<pre><code>\r\n<h1>Pesquisa<\/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>N\u00e3o \u00e9 bonito, mas \u00e9 funcional. Em seguida, criei uma a\u00e7\u00e3o Search. Essa a\u00e7\u00e3o receber\u00e1 a consulta de pesquisa e produzir\u00e1 os resultados do Couchbase. Os resultados ser\u00e3o muito parecidos com o que vimos no Console do Couchbase: ID do documento, pontua\u00e7\u00e3o de relev\u00e2ncia e fragmentos destacados.<\/p>\n<p>H\u00e1 tr\u00eas etapas para a execu\u00e7\u00e3o de uma pesquisa de texto completo:<\/p>\n<ol>\n<li>Instanciar algum objeto que implemente <code>ISearchQuery<\/code>. H\u00e1 muitas op\u00e7\u00f5es; estou usando <code>MatchQuery<\/code> para este exemplo.<\/li>\n<li>Instanciar um objeto SearchParams para especificar as op\u00e7\u00f5es de pesquisa.<\/li>\n<li>Use um <code>IBucket<\/code> para executar a consulta + par\u00e2metros e obter resultados.<\/li>\n<\/ol>\n<p>Neste exemplo, realizei todas as tr\u00eas etapas diretamente na a\u00e7\u00e3o Search:<\/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>Algumas observa\u00e7\u00f5es sobre o SearchParams:<\/p>\n<ul>\n<li>Estou limitando-o aos 10 primeiros. H\u00e1 tamb\u00e9m um m\u00e9todo Skip() que voc\u00ea pode usar para pagina\u00e7\u00e3o.<\/li>\n<li>Estou definindo um tempo limite de 10000ms. Se eu criar o \u00edndice corretamente, os resultados ser\u00e3o retornados muito rapidamente, mas se eu mexer no \u00edndice e algo der errado, quero que a pesquisa falhe rapidamente.<\/li>\n<li>Estou definindo o estilo de destaque como HTML. Isso colocar\u00e1 o <code><mark><\/mark><\/code> ao redor dos termos de pesquisa destacados nos resultados do fragmento.<\/li>\n<\/ul>\n<p>Tamb\u00e9m criei um <code>SearchResultsModel<\/code> modelo de visualiza\u00e7\u00e3o. Isso faz o mapeamento de que preciso para obter o ID do documento, a pontua\u00e7\u00e3o e os fragmentos dos resultados da pesquisa (bem como as palavras-chave que o usu\u00e1rio digitou).<\/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>Por fim, aqui est\u00e1 a visualiza\u00e7\u00e3o Search.cshtml:<\/p>\n<pre><code>@model FullTextSearchExample.Models.SearchResultsModel\r\n<h1>Pesquisa<\/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>N\u00e3o \u00e9 uma p\u00e1gina HTML muito bonita, mas \u00e9 funcional. Veja como ela se parece em a\u00e7\u00e3o:<\/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>Conclus\u00e3o<\/h2>\n<p>Lembre-se de que esse recurso \u00e9 apenas uma pr\u00e9via para desenvolvedores: ainda n\u00e3o h\u00e1 suporte para ele e ainda n\u00e3o \u00e9 recomendado para produ\u00e7\u00e3o. Mas a pesquisa de texto completo est\u00e1 chegando ao Couchbase. Na verdade, voc\u00ea pode opinar sobre como o recurso ser\u00e1 implementado. D\u00ea uma olhada no <a href=\"https:\/\/github.com\/couchbaselabs\/sdk-rfcs\/pull\/30\">Pesquisa de texto completo RFC no GitHub<\/a>E fique \u00e0 vontade para fazer perguntas ou deixar coment\u00e1rios.<\/p>\n<p>Ainda tem d\u00favidas? Precisa de ajuda com alguma coisa? Deixe um coment\u00e1rio, <a href=\"https:\/\/twitter.com\/mgroves\">me envie uma mensagem no Twitter<\/a>ou envie um e-mail para mim (matthew.groves AT couchbase DOT com).<\/p>","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>","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.2 (Yoast SEO v26.2) - 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\/pt\/full-text-search-in-net-with-couchbase-4-5\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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 minutos\" \/>\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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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\/pt\/full-text-search-in-net-with-couchbase-4-5\/","og_locale":"pt_BR","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\/pt\/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 minutos"},"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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/full-text-search-in-net-with-couchbase-4-5\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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":"pt-BR","@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 \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2269"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2269\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2269"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}