{"id":2149,"date":"2016-02-24T17:06:22","date_gmt":"2016-02-24T17:06:22","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2149"},"modified":"2025-06-13T20:59:48","modified_gmt":"2025-06-14T03:59:48","slug":"cbftjavapreview","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/cbftjavapreview\/","title":{"rendered":"Visualiza\u00e7\u00e3o da pesquisa de texto completo no Couchbase usando o Java SDK"},"content":{"rendered":"<p>Nesta postagem do blog, daremos uma olhada na API de visualiza\u00e7\u00e3o para pesquisa de texto completo em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/next\/\"><strong>Couchbase 4.5<\/strong><\/a>. Observe que essa API, lan\u00e7ada na vers\u00e3o mais recente do <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/sdks\/java-2.2\/download-links.html\">Java SDK <\/a>\u00a0(<code>2.2.4<\/code>), ainda \u00e9 <code>@Experimental<\/code>.<\/p>\n<p>Abordaremos o assunto:<\/p>\n<ul class=\"toc\">\n<li><a href=\"#toc_0\">Pesquisa de texto completo no Couchbase?<\/a><\/li>\n<li><a href=\"#toc_1\">A API Java<\/a><\/li>\n<li><a href=\"#toc_2\">V\u00e1rios tipos de consultas<\/a>\n<ul>\n<li><a href=\"#toc_3\">Consulta Fuzzy<\/a><\/li>\n<li><a href=\"#toc_4\">V\u00e1rios termos: MatchPhrase<\/a><\/li>\n<li><a href=\"#toc_5\">Consulta Regexp<\/a><\/li>\n<li><a href=\"#toc_6\">Consulta de prefixo<\/a><\/li>\n<li><a href=\"#toc_7\">Consultas de intervalo e data<\/a><\/li>\n<li><a href=\"#toc_8\">Consulta gen\u00e9rica<\/a><\/li>\n<li><a href=\"#toc_9\">Combina\u00e7\u00e3o<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#toc_10\">Obtendo explica\u00e7\u00f5es sobre os acertos<\/a><\/li>\n<li><a href=\"#toc_11\">Conclus\u00e3o<\/a><\/li>\n<\/ul>\n<p>Essa API experimental pode ser usada com o Couchbase Server 4.5 Developer Preview, desde que voc\u00ea use a API <code>2.2.4<\/code>\u00a0cliente Java SDK, que voc\u00ea pode obter por meio do Maven. Adicione a seguinte depend\u00eancia ao seu <code>pom.xml<\/code>:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-markup\">\r\n    com.couchbase.client\r\n    java-client\r\n    2.2.4\r\n<\/code><\/pre>\n<\/div>\n<div><\/div>\n<h2 id=\"toc_0\">Pesquisa de texto completo no Couchbase?<\/h2>\n<p>Sim! O pr\u00f3ximo <code>4.5<\/code> (codinome Watson) incluir\u00e1 um indexador de texto completo (FTS, tamb\u00e9m conhecido como CBFT) baseado no software livre <a href=\"https:\/\/www.blevesearch.com\/\">Bleve<\/a> projeto. O Bleve trata de pesquisa de texto completo e indexa\u00e7\u00e3o em Go (grito para o nosso pr\u00f3prio <a href=\"https:\/\/twitter.com\/mschoch\">Marty Schoch<\/a> por ter iniciado esse projeto).<\/p>\n<p>A ideia \u00e9 aproveitar o Bleve para fornecer uma pesquisa de texto completo pronta para uso no Couchbase Server, sem a necessidade de usar conectores para software externo (que \u00e9 executado em seu pr\u00f3prio cluster). Se essa solu\u00e7\u00e3o pronta para uso n\u00e3o atender totalmente \u00e0s suas necessidades, \u00e9 claro que voc\u00ea ainda poder\u00e1 usar estes <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.0\/connectors\/elasticsearch-2.1\/elastic-intro.html\">conectores<\/a>mas, para necessidades mais simples, voc\u00ea pode optar por uma \u00fanica solu\u00e7\u00e3o.<\/p>\n<p>O FTS oferece uma s\u00e9rie de recursos que s\u00e3o fornecidos pelo Bleve: Analisadores de texto, Tokenizers e filtros de token de p\u00f3s-processamento que est\u00e3o al\u00e9m do escopo desta postagem, bem como os v\u00e1rios tipos de <em>consultas<\/em> que voc\u00ea pode executar nos \u00edndices resultantes. Vamos ver quais s\u00e3o esses tipos e como voc\u00ea pode esperar us\u00e1-los no contexto do Java SDK.<\/p>\n<p>No restante desta postagem do blog, usaremos tr\u00eas \u00edndices que voc\u00ea poder\u00e1 criar por meio do console administrativo da Web no pr\u00f3ximo 4.5 Developer Preview:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/cbftjavapreview\/pathtocbft.png\" align=\"middle\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/cbftjavapreview\/createcbftindex.png\" align=\"middle\" \/><\/p>\n<p>Aqui est\u00e1 a lista de \u00edndices na interface do usu\u00e1rio:<br \/>\n<img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/cbftjavapreview\/indexlist.png\" align=\"middle\" \/><br \/>\nN\u00f3s temos:<\/p>\n<ul>\n<li>a <code>\u00edndice de cerveja<\/code> que indexa todo o conte\u00fado de cada documento no <code>`beer-sample`<\/code> balde.<\/li>\n<li>a <code>travelIndex<\/code> que indexa todo o conte\u00fado de cada documento no <code>`amostra de viagem`<\/code> balde.<\/li>\n<li>um \u00edndice de alias, <code>commonIndex<\/code>que \u00e9 uma uni\u00e3o dos dois \u00edndices acima.<\/li>\n<\/ul>\n<h2 id=\"toc_1\">A API Java<\/h2>\n<p>O ponto de entrada do recurso de pesquisa de texto completo no Java SDK est\u00e1 no <code>Balde<\/code>, usando o <code>consulta(SearchQuery ftq)<\/code> m\u00e9todo. Isso \u00e9 consistente com os m\u00e9todos de consulta existentes j\u00e1 presentes na API para executar um <code>Consulta<\/code> ou um <code>N1qlQuery<\/code>.<\/p>\n<p>A API para pesquisa de texto completo segue o padr\u00e3o <em>construtor<\/em> padr\u00e3o. Identifique o tipo de consulta que voc\u00ea deseja e use o construtor correspondente para constru\u00ed-la, obtenha o <code>Pesquisa<\/code> usando <code>construir()<\/code> e execut\u00e1-lo usando <code>bucket.query(searchQuery)<\/code>.<\/p>\n<p>Vamos dar um exemplo (muito simples) e ver como ele pode ser consumido:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">\/\/we'll use that Cluster and Bucket for the remainder of the examples\r\nCluster cluster = CouchbaseCluster.create(\"127.0.0.1\");\r\nBucket bucket = cluster.openBucket(\"beer-sample\");\r\n\r\n\/\/we use a simple form of query:\r\nSearchQuery ftq = MatchQuery.on(\"beerIndex\").match(\"national\").limit(3).build();\r\n\r\n\/\/we fire the query and look at results\r\nSearchQueryResult result = bucket.query(ftq);\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    System.out.println(row);\r\n}<\/code><\/pre>\n<\/div>\n<p>Se analisarmos cada se\u00e7\u00e3o individualmente, veremos o que aconteceu:<\/p>\n<ol>\n<li>Criamos um <code>MatchQuery<\/code> em um \u00fanico per\u00edodo.<\/li>\n<li>Ele \u00e9 executado na amostra de cerveja (<code>.on(beerIndex<\/code>), procura por ocorr\u00eancias textuais da palavra \"national\" (<code>.query(\"national\")<\/code>) ou termos pr\u00f3ximos.<\/li>\n<li>Uma configura\u00e7\u00e3o adicional \u00e9 feita para limitar o n\u00famero de resultados a 3 (<code>limite(3)<\/code>) e a consulta real \u00e9 criada nesse ponto (<code>.build()<\/code>).<\/li>\n<li>A consulta \u00e9 executada (<code>bucket.query(ftq)<\/code>) e retorna um <code>Resultado da pesquisa<\/code>.<\/li>\n<li>Emitimos o resultado <code>totalHits()<\/code> e linhas individuais (tamb\u00e9m acess\u00edveis como uma lista por meio de <code>hits()<\/code>).<\/li>\n<\/ol>\n<p>A execu\u00e7\u00e3o desse c\u00f3digo gera resultados:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">totalHits: 31\r\nSearchQueryHit{id='dc_brau', score=0.09068310490562362, fragments={}}\r\nSearchQueryHit{id='brouwerij_nacional_balashi', score=0.12085760187148556, fragments={}}\r\nSearchQueryHit{id='cervecera_nacional', score=0.09863195902067363, fragments={}}<\/code><\/pre>\n<\/div>\n<p>Vemos que o total de acessos nos d\u00e1 o n\u00famero real de acessos antes de o limite ser aplicado. O <code>hits()<\/code> O m\u00e9todo retorna 3 <code>SearchQueryRow<\/code> objetos, conforme solicitado.<\/p>\n<p>Cada acerto cont\u00e9m a chave do documento associado no Couchbase (<code>id()<\/code>), bem como mais informa\u00e7\u00f5es sobre a correspond\u00eancia, por exemplo, uma pontua\u00e7\u00e3o para a correspond\u00eancia (<code>pontua\u00e7\u00e3o()<\/code>)... Se quiser, voc\u00ea pode recuperar o documento associado usando <code>bucket.get(row.id())<\/code>:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">result = bucket.query(ftq);\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    System.out.println(row);\r\n    System.out.println(bucket.get(row.id()).content());\r\n}<\/code><\/pre>\n<\/div>\n<p>Isso nos d\u00e1, para o primeiro acerto:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">SearchQueryHit{id='dc_brau', score=0.09068310490562362, fragments={}}\r\n{\"country\":\"United States\",\"website\":\"https:\/\/www.dcbrau.com\/\",\"code\":\"20018\",\"address\":[\"3178-B Bladensburg Rd. NE\"],\"city\":\"Washington\",\"phone\":\"\",\"name\":\"DC Brau\",\r\n\"description\":\"The first brewery to open in the nation's capital since Prohibition.\",\"state\":\"DC\",\"type\":\"brewery\",\"updated\":\"2011-08-08 19:02:40\"}<\/code><\/pre>\n<\/div>\n<p>Se observarmos atentamente o JSON do documento, perceberemos onde o documento provavelmente correspondeu. Na se\u00e7\u00e3o \"<code>descri\u00e7\u00e3o<\/code>\" do documento, h\u00e1 esta frase:<\/p>\n<blockquote><p>A primeira cervejaria a ser aberta na <strong>na\u00e7\u00e3o<\/strong>desde a Lei Seca.<\/p><\/blockquote>\n<p>Observe tamb\u00e9m que a consulta de texto procurou a palavra solicitada e palavras derivadas que t\u00eam a mesma raiz. Na verdade, ela aplicou uma imprecis\u00e3o de 2 (consulte a pr\u00f3xima se\u00e7\u00e3o).<\/p>\n<p>Esse padr\u00e3o tamb\u00e9m pode ser aplicado a outros tipos de consultas, portanto, vamos dar uma olhada em mais algumas e ver que tipo de pesquisa pode ser realizada.<\/p>\n<h2 id=\"toc_2\">V\u00e1rios tipos de consultas<\/h2>\n<h2 id=\"toc_3\">Consulta Fuzzy<\/h2>\n<p>As consultas difusas podem ser realizadas com o <code>MatchQuery<\/code>, especificando um <a href=\"https:\/\/en.wikipedia.org\/wiki\/Levenshtein_distance\">Dist\u00e2ncia de Levenshtein<\/a> como o m\u00e1ximo <code>fuzziness()<\/code> para permitir o termo:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">result = bucket.query(MatchQuery.on(\"beerIndex\")\r\n    .match(\"sammar\")\r\n    .field(\"name\")\r\n    .fuzziness(2) \/\/actually the default\r\n    .build());\r\n\r\nSystem.out.println(\"nFuzzy Match Query\");\r\nSystem.out.println(\"totalHits (fuzziness = 2): \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    System.out.println(bucket.get(row.id()).content().get(\"name\"));\r\n}<\/code><\/pre>\n<\/div>\n<p>Em uma imprecis\u00e3o de <strong>2<\/strong>Isso corresponde a palavras como \"hammer\" (martelo), \"mamma\" (mam\u00e3e) ou \"summer\" (ver\u00e3o):<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Fuzzy Match Query\r\ntotalHits (fuzziness = 2): 45\r\nMamma Mia! Pizza Beer\r\nRedhook Long Hammer IPA\r\nSummer Wheat<\/code><\/pre>\n<\/div>\n<p>Em uma imprecis\u00e3o de <strong>1<\/strong>n\u00e3o foi encontrada nenhuma correspond\u00eancia:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Fuzzy Match Query\r\ntotalHits (fuzziness = 1): 0<\/code><\/pre>\n<\/div>\n<p>Um tipo de consulta dedicada \u00e0 imprecis\u00e3o e que n\u00e3o aplica nenhum analisador tamb\u00e9m \u00e9 fornecido no <code>FuzzyQuery<\/code>.<\/p>\n<h2 id=\"toc_4\">V\u00e1rios termos: MatchPhrase<\/h2>\n<p>Como vimos, <code>MatchQuery<\/code> \u00e9 uma consulta baseada em termos que permite especificar opcionalmente a imprecis\u00e3o e tamb\u00e9m aplica o mesmo filtro ao termo pesquisado que pode ter sido aplicado ao campo (por exemplo, stemming, etc.):<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">MatchQuery.on(\"beerIndex\")\r\n    .match(\"sesonal\")\r\n    .fuzziness(2)\r\n    .field(\"description\").build();<\/code><\/pre>\n<\/div>\n<p>Voc\u00ea pode pesquisar v\u00e1rios termos em uma \u00fanica consulta usando um <code>Combinar frase<\/code> consulta. Os termos s\u00e3o analisados e a imprecis\u00e3o pode ser ativada opcionalmente:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">MatchPhraseQuery.on(\"beerIndex\").matchPhrase(\"summer seasonal\").field(\"description\");<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_5\">Consulta Regexp<\/h2>\n<p>A <code>RegexpQuery<\/code> n\u00e3o faz apenas a correspond\u00eancia literal, mas permite a correspond\u00eancia usando uma express\u00e3o regular. Veja este exemplo:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">result = bucket.query(RegexpQuery.on(\"beerIndex\")\r\n    .regexp(\"[tp]ale\")\r\n    .field(\"name\")\r\n    .build());\r\n\r\nSystem.out.println(\"nRegexp Query\");\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    System.out.println(bucket.get(row.id()).content().get(\"name\"));\r\n}<\/code><\/pre>\n<\/div>\n<p>Observe que essa consulta visa um campo espec\u00edfico no json (<code>campo(\"nome\")<\/code>). Queremos todos os nomes que contenham \"tale\" ou \"pale\". Aqui est\u00e3o alguns nomes que correspondem a essa consulta:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Regexp Query\r\ntotalHits: 408\r\nTall Tale Pale Ale\r\nBard's Tale Beer Company\r\nPale Ale<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_6\">Consulta de prefixo<\/h2>\n<p>A <code>PrefixQuery<\/code> procura ocorr\u00eancias de palavras que come\u00e7am com a cadeia de caracteres fornecida:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">result = bucket.query(PrefixQuery.on(\"beerIndex\")\r\n    .prefix(\"weiss\")\r\n    .field(\"name\")\r\n    .build());\r\n\r\nSystem.out.println(\"nPrefix Query\");\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    System.out.println(bucket.get(row.id()).content().get(\"name\"));\r\n}<\/code><\/pre>\n<\/div>\n<p>Mais uma vez, olhamos apenas para o interior do <code>nome<\/code> desta vez para palavras que come\u00e7am com \"weiss\":<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Prefix Query\r\ntotalHits: 74\r\nBavarian-Weissbier Hefeweisse \/ Weisser Hirsch\r\nM\u00fcnchner Kindl Weissbier \/ M\u00fcnchner Weisse\r\nFranziskaner Hefe-Weissbier Hell  \/ Franziskaner Club-Weiss\r\nWeissenheimer Wheat<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_7\">Consultas de intervalo e data<\/h2>\n<p><code>FTS<\/code> tamb\u00e9m \u00e9 bom com dados n\u00e3o textuais. Por exemplo, o <code>NumericRangeQuery<\/code> permite que voc\u00ea procure valores num\u00e9ricos dentro de um intervalo fornecido:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">result = bucket.query(NumericRangeQuery.on(\"beerIndex\")\r\n    .min(3)\r\n    .max(4)\r\n    .field(\"abv\")\r\n    .fields(\"name\", \"abv\")\r\n    .build());\r\n\r\nSystem.out.println(\"nNumeric Range Query\");\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    JsonDocument doc = bucket.get(row.id());\r\n    System.out.println(\"\"\" + doc.content().get(\"name\") + \"\", abv: \" + doc.content().get(\"abv\"));\r\n}<\/code><\/pre>\n<\/div>\n<p>Quais s\u00e3o as sa\u00eddas:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Numeric Range Query\r\ntotalHits: 62\r\n\"Stud Service Stout\", abv: 3.1\r\n\"Blonde\", abv: 3.0\r\n\"Locke Mountain Light\", abv: 3.7<\/code><\/pre>\n<\/div>\n<p>As datas tamb\u00e9m s\u00e3o cobertas com o <code>DateRangeQuery<\/code>:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">Calendar calendar = Calendar.getInstance();\r\ncalendar.set(2011, Calendar.MARCH, 1);\r\nDate start = calendar.getTime();\r\ncalendar.set(2011, Calendar.APRIL, 1);\r\nDate end = calendar.getTime();\r\n\r\nresult = bucket.query(DateRangeQuery.on(\"beerIndex\")\r\n    .start(start)\r\n    .end(end)\r\n    .field(\"updated\")\r\n    .fields(\"name\", \"updated\")\r\n    .build());\r\n\r\nSystem.out.println(\"nDate Range Query\");\r\nSystem.out.println(\"totalHits: \" + result.totalHits());\r\nfor (SearchQueryRow row : result) {\r\n    JsonDocument doc = bucket.get(row.id());\r\n    System.out.println(\"\"\" + doc.content().get(\"name\") + \"\", updated: \" + doc.content().get(\"updated\"));\r\n}    <\/code><\/pre>\n<\/div>\n<p>Quais s\u00e3o as sa\u00eddas:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-none\">Date Range Query\r\ntotalHits: 4\r\n\"Dank\", updated: 2011-03-16 09:06:54\r\n\"Oso\", updated: 2011-03-16 09:05:15\r\n\"Summer Teeth\", updated: 2011-03-08 12:22:14\r\n\"Columbus Brewing Company\", updated: 2011-03-08 12:19:07<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_8\">Consulta gen\u00e9rica<\/h2>\n<p><code>FTS<\/code> tamb\u00e9m oferecem uma forma mais gen\u00e9rica de consulta que combina frases, termos e muito mais usando o <a href=\"https:\/\/www.blevesearch.com\/docs\/Query-String-Query\/\"><code>Sintaxe de consulta de cadeia de caracteres<\/code><\/a>. Isso pode ser acessado na API por meio do <code>Consulta de cadeia de caracteres<\/code>.<\/p>\n<h2 id=\"toc_9\">Combina\u00e7\u00e3o<\/h2>\n<p>Al\u00e9m disso, voc\u00ea pode combinar crit\u00e9rios simples como <code>MatchQuery<\/code> usando consultas combinadas. Usando essas duas consultas de termos simples:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">MatchQuery bitterQuery = MatchQuery.on(\"beerIndex\").match(\"bitter\").field(\"description\").build();\r\nMatchQuery maltyQuery = MatchQuery.on(\"beerIndex\").match(\"malty\").field(\"description\").build();<\/code><\/pre>\n<\/div>\n<p>Voc\u00ea pode combin\u00e1-los de diferentes maneiras:<\/p>\n<ul>\n<li>a <code>conjun\u00e7\u00e3o<\/code> procura por todos os termos<\/li>\n<\/ul>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\"> ConjunctionQuery.on(\"beerIndex\").conjuncts(bitterQuery, maltyQuery)<\/code><\/pre>\n<\/div>\n<ul>\n<li>a <code>disjun\u00e7\u00e3o<\/code> procura pelo menos um termo<\/li>\n<\/ul>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\"> DisjunctionQuery.on(\"beerIndex\").disjuncts(bitterQuery, maltyQuery)<\/code><\/pre>\n<\/div>\n<ul>\n<li>a <code>consulta booleana<\/code> permite que voc\u00ea combine as duas abordagens<\/li>\n<\/ul>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\"> BooleanQuery.on(\"beerIndex\").must(bitterQuery).mustNot(maltyQuery)<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_10\">Obtendo explica\u00e7\u00f5es sobre os acertos<\/h2>\n<p>Se voc\u00ea quiser obter insights sobre a pontua\u00e7\u00e3o e a correspond\u00eancia de uma determinada <code>SearchQueryRow<\/code>voc\u00ea pode criar sua consulta usando o <code>.explain(true)<\/code> e obter detalhes do \u00edndice no par\u00e2metro <code>explica\u00e7\u00e3o()<\/code> campo:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-javascript\">{\"message\":\"sum of:\",\"children\":[{\"message\":\"product of:\",\"children\":[{\"message\":\"sum of:\",\"children\":[{\"message\":\"product of:\",\"children\":[{\"message\":\"sum of:\",\"children\":[\r\n{\r\n    \"message\": \"weight(_all:national^1.000000 in penn_brewery-penn_marzen), product of:\",\r\n    \"children\": [\r\n        {\r\n            \"message\": \"queryWeight(_all:national^1.000000), product of:\",\r\n            \"children\": [\r\n                {\r\n                    \"message\": \"boost\",\r\n                    \"value\": 1\r\n                },\r\n                {\r\n                    \"message\": \"idf(docFreq=17, maxDocs=7303)\",\r\n                    \"value\": 7.005668743723945\r\n                },\r\n                {\r\n                    \"message\": \"queryNorm\",\r\n                    \"value\": 0.1427415478209491\r\n                }\r\n            ],\r\n            \"value\": 0.9999999999999999\r\n        },\r\n        {\r\n            \"message\": \"fieldWeight(_all:national in penn_brewery-penn_marzen), product of:\",\r\n            \"children\": [\r\n                {\r\n                    \"message\": \"tf(termFreq(_all:national)=1\",\r\n                    \"value\": 1\r\n                },\r\n                {\r\n                    \"message\": \"fieldNorm(field=_all, doc=penn_brewery-penn_marzen)\",\r\n                    \"value\": 0.10000000149011612\r\n                },\r\n                {\r\n                    \"message\": \"idf(docFreq=17, maxDocs=7303)\",\r\n                    \"value\": 7.005668743723945\r\n                }\r\n            ],\r\n            \"value\": 0.7005668848116544\r\n        }\r\n    ],\r\n    \"value\": 0.7005668848116543\r\n}    ],\"value\":0.7005668848116543},{\"message\":\"coord(1\/1)\",\"value\":1}],\"value\":0.7005668848116543}],\"value\":0.7005668848116543},{\"message\":\"coord(1\/1)\",\"value\":1}],\"value\":0.7005668848116543}],\"value\":0.7005668848116543}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_11\">Conclus\u00e3o<\/h2>\n<p>Esperamos que essa pr\u00e9via da API tenha despertado seu interesse!<\/p>\n<p>V\u00e1 em frente e fa\u00e7a o download do primeiro <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/4-5-dp\/\">Visualiza\u00e7\u00e3o do Couchbase 4.5 para desenvolvedores<\/a> com o servi\u00e7o de pesquisa de texto completo incorporado. Esperamos que voc\u00ea possa come\u00e7ar a pesquisar rapidamente usando o servi\u00e7o associado <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/sdks\/java-2.2\/download-links.html\">API do Java SDK<\/a>.<\/p>\n<p>E at\u00e9 l\u00e1... <strong>Boa codifica\u00e7\u00e3o!<\/strong><br \/>\n&#8211; <em>A equipe do Java SDK<\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>In this blog post, we&#8217;ll have a look at the preview API for full text search in Couchbase 4.5. Please note that this API, released in the latest Java SDK \u00a0(2.2.4), is still @Experimental. We&#8217;ll cover: Full Text Search in [&hellip;]<\/p>","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2165,1818],"tags":[1584,1583,1466],"ppma_author":[9022],"class_list":["post-2149","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-full-text-search","category-java","tag-bleve","tag-cbft","tag-preview"],"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>Preview of Full Text Search in Couchbase using the Java SDK<\/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\/cbftjavapreview\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Preview of Full Text Search in Couchbase using the Java SDK\" \/>\n<meta property=\"og:description\" content=\"In this blog post, we&#8217;ll have a look at the preview API for full text search in Couchbase 4.5. Please note that this API, released in the latest Java SDK \u00a0(2.2.4), is still @Experimental. We&#8217;ll cover: Full Text Search in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/cbftjavapreview\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-02-24T17:06:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:59:48+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Preview of Full Text Search in Couchbase using the Java SDK\",\"datePublished\":\"2016-02-24T17:06:22+00:00\",\"dateModified\":\"2025-06-14T03:59:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/\"},\"wordCount\":1090,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"bleve\",\"cbft\",\"preview\"],\"articleSection\":[\"Couchbase Server\",\"Full-Text Search\",\"Java\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/\",\"name\":\"Preview of Full Text Search in Couchbase using the Java SDK\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-02-24T17:06:22+00:00\",\"dateModified\":\"2025-06-14T03:59:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#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\/cbftjavapreview\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preview of Full Text Search in Couchbase using the Java SDK\"}]},{\"@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\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Visualiza\u00e7\u00e3o da pesquisa de texto completo no Couchbase usando o Java SDK","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\/cbftjavapreview\/","og_locale":"pt_BR","og_type":"article","og_title":"Preview of Full Text Search in Couchbase using the Java SDK","og_description":"In this blog post, we&#8217;ll have a look at the preview API for full text search in Couchbase 4.5. Please note that this API, released in the latest Java SDK \u00a0(2.2.4), is still @Experimental. We&#8217;ll cover: Full Text Search in [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/cbftjavapreview\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-02-24T17:06:22+00:00","article_modified_time":"2025-06-14T03:59:48+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Preview of Full Text Search in Couchbase using the Java SDK","datePublished":"2016-02-24T17:06:22+00:00","dateModified":"2025-06-14T03:59:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/"},"wordCount":1090,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["bleve","cbft","preview"],"articleSection":["Couchbase Server","Full-Text Search","Java"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/","url":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/","name":"Visualiza\u00e7\u00e3o da pesquisa de texto completo no Couchbase usando o Java SDK","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-02-24T17:06:22+00:00","dateModified":"2025-06-14T03:59:48+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/cbftjavapreview\/#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\/cbftjavapreview\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Preview of Full Text Search in Couchbase using the Java SDK"}]},{"@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\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, engenheiro de software, Pivotal","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2149","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\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2149"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2149\/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=2149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2149"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}