{"id":2871,"date":"2017-03-01T08:46:35","date_gmt":"2017-03-01T16:46:35","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2871"},"modified":"2025-06-13T20:28:13","modified_gmt":"2025-06-14T03:28:13","slug":"using-couchbase-full-text-search-service-java","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-full-text-search-service-java\/","title":{"rendered":"Usando o servi\u00e7o de pesquisa de texto completo do Couchbase em Java"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener\">Ratnopam Chakrabarti<\/a><\/em><em>\u00a0\u00e9 um desenvolvedor de software que trabalha atualmente para a Ericsson Inc. Ele tem se concentrado em IoT, tecnologias m\u00e1quina a m\u00e1quina, carros conectados e dom\u00ednios de cidades inteligentes por um bom tempo. Ele adora aprender novas tecnologias e coloc\u00e1-las em pr\u00e1tica. Quando n\u00e3o est\u00e1 trabalhando, gosta de passar o tempo com seu filho de 3 anos.<\/em><\/p>\n<p>A pesquisa baseada em texto completo \u00e9 um recurso que permite que os usu\u00e1rios pesquisem com base em textos e palavras-chave, e \u00e9 muito popular entre os usu\u00e1rios e a comunidade de desenvolvedores. Portanto, \u00e9 \u00f3bvio que h\u00e1 muitas APIs e estruturas que oferecem pesquisa de texto completo, incluindo Apache Solr, Lucene e Elasticsearch, s\u00f3 para citar alguns. <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/fts\/full-text-intro.html\">Couchbase<\/a>A Couchbase, uma das principais gigantes do NoSQL, come\u00e7ou a implementar esse recurso na vers\u00e3o 4.5 do Couchbase Server.<\/p>\n<p>Nesta postagem, descreverei como integrar o servi\u00e7o de pesquisa de texto completo em seu aplicativo usando o <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/java\/start-using-sdk.html\">SDK Java do Couchbase<\/a>.<\/p>\n<h4>Configura\u00e7\u00e3o<\/h4>\n<p>V\u00e1 para start.spring.io e selecione o Couchbase como uma depend\u00eancia em seu aplicativo de inicializa\u00e7\u00e3o do Spring.<\/p>\n<p>Depois de configurar o projeto, voc\u00ea dever\u00e1 ver a seguinte depend\u00eancia no arquivo de modelo de objeto do projeto (pom.xml). Ela garante que todas as bibliotecas do Couchbase estejam instaladas para o aplicativo.<\/p>\n<p>&lt;dependency&gt;<\/p>\n<p>org.springframework.boot<\/p>\n<p>spring-boot-starter-data-couchbase<\/p>\n<p>&lt;\/dependency&gt;<\/p>\n<p>Voc\u00ea precisa configurar um bucket do Couchbase para armazenar seu conjunto de dados de amostra para pesquisa.<\/p>\n<p>Criei um bucket chamado \"conference\" no console de administra\u00e7\u00e3o do Couchbase.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/pasted-image-0.png\" alt=\"Couchbase admin console\" width=\"1139\" height=\"374\" \/><\/p>\n<p>O compartimento \"conference\" tem tr\u00eas documentos no momento e eles cont\u00eam dados sobre diferentes confer\u00eancias realizadas em todo o mundo. Voc\u00ea pode estender esse modelo de dados ou criar o seu pr\u00f3prio se quiser fazer experi\u00eancias. Por exemplo, curr\u00edculos, cat\u00e1logos de produtos ou at\u00e9 mesmo tweets s\u00e3o bons casos de uso para a pesquisa de texto completo. No entanto, para o caso em quest\u00e3o, vamos nos ater aos dados da confer\u00eancia, conforme mostrado abaixo:<\/p>\n<p><code><br \/>\n{<\/code><\/p>\n<p>\"t\u00edtulo\": \"DockerCon\",<\/p>\n<p>\"Tipo\": \"Confer\u00eancia\",<\/p>\n<p>\"localiza\u00e7\u00e3o\": \"Austin\",<\/p>\n<p>\"start\": \"04\/17\/2017\",<\/p>\n<p>\"end\": \"04\/20\/2017\",<\/p>\n<p>\"t\u00f3picos\": [<\/p>\n<p>\"cont\u00eaineres\",<\/p>\n<p>\"devops\",<\/p>\n<p>\"microsservi\u00e7os\",<\/p>\n<p>\"desenvolvimento de produtos\",<\/p>\n<p>\"virtualiza\u00e7\u00e3o\"<\/p>\n<p>],<\/p>\n<p>\"participantes\": 20000,<\/p>\n<p>\"summary\": \"A DockerCon apresentar\u00e1 t\u00f3picos e conte\u00fado que abrangem todos os aspectos do Docker e seu ecossistema e ser\u00e1 adequada para desenvolvedores, DevOps, administradores de sistemas e executivos de n\u00edvel C\",<\/p>\n<p>\"social\": {<\/p>\n<p>\"facebook\": \"https:\/\/www.facebook.com\/dockercon\",<\/p>\n<p>\"twitter\": \"https:\/\/www.twitter.com\/dockercon\"<\/p>\n<p>},<\/p>\n<p>\"alto-falantes\": [<\/p>\n<p>{<\/p>\n<p>\"name\": \"Arun Gupta\",<\/p>\n<p>\"talk\": \"Docker com couchbase\",<\/p>\n<p>\"date\": \"04\/18\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"2\"<\/p>\n<p>},<\/p>\n<p>{<\/p>\n<p>\"name\": \"Laura Frank\",<\/p>\n<p>\"talk\": \"Opensource\",<\/p>\n<p>\"date\": \"04\/19\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"2\"<\/p>\n<p>}<\/p>\n<p>]<\/p>\n<p>}<\/p>\n<p>Para usar a pesquisa de texto completo no conjunto de dados acima, primeiro voc\u00ea precisa criar um \u00edndice de pesquisa de texto completo. Execute as etapas a seguir:<\/p>\n<p>No console de administra\u00e7\u00e3o do Couchbase, clique na guia \u00cdndices.<\/p>\n<p>Clique no link Full Text (Texto completo), que listar\u00e1 os \u00edndices de texto completo atuais.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/pasted-image-0-4.png\" alt=\"text indexes Image\" width=\"1160\" height=\"288\" \/><\/p>\n<p>Como voc\u00ea pode imaginar, criei um \u00edndice chamado \"conference-search\" que eu usaria no c\u00f3digo Java para pesquisar os dados relacionados \u00e0 confer\u00eancia.<\/p>\n<p>Clique no bot\u00e3o New Full Text Index (Novo \u00edndice de texto completo) para criar um novo \u00edndice.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/pasted-image-0-1.png\" alt=\"pasted image 0 1\" \/><\/p>\n<p>Sim, \u00e9 muito f\u00e1cil. Depois de criar o \u00edndice, voc\u00ea estar\u00e1 pronto para us\u00e1-lo no aplicativo que est\u00e1 criando.<\/p>\n<p>Antes de nos aprofundarmos no c\u00f3digo, vamos dar uma olhada nos outros dois documentos que j\u00e1 est\u00e3o no balde.<\/p>\n<p><code><br \/>\nConfer\u00eancia::2<\/code><\/p>\n<p>{<\/p>\n<p>\"t\u00edtulo\": \"Devoxx UK\",<\/p>\n<p>\"Tipo\": \"Confer\u00eancia\",<\/p>\n<p>\"localiza\u00e7\u00e3o\": \"Belgium\",<\/p>\n<p>\"start\": \"05\/11\/2017\",<\/p>\n<p>\"end\": \"05\/12\/2017\",<\/p>\n<p>\"t\u00f3picos\": [<\/p>\n<p>\"nuvem\",<\/p>\n<p>\"iot\",<\/p>\n<p>\"big data\",<\/p>\n<p>\"aprendizado de m\u00e1quina\",<\/p>\n<p>\"realidade virtual\"<\/p>\n<p>],<\/p>\n<p>\"participantes\": 10000,<\/p>\n<p>\"summary\": \"A Devoxx UK retorna a Londres em 2017. Mais uma vez, receberemos palestrantes e participantes incr\u00edveis para obter o melhor conte\u00fado para desenvolvedores e experi\u00eancias incr\u00edveis\",<\/p>\n<p>\"social\": {<\/p>\n<p>\"facebook\": \"https:\/\/www.facebook.com\/devoxxUK\",<\/p>\n<p>\"twitter\": \"https:\/\/www.twitter.com\/devoxxUK\"<\/p>\n<p>},<\/p>\n<p>\"alto-falantes\": [<\/p>\n<p>{<\/p>\n<p>\"name\": \"Viktor Farcic\",<\/p>\n<p>\"talk\": \"Cloudbees\",<\/p>\n<p>\"date\": \"05\/11\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"2\"<\/p>\n<p>},<\/p>\n<p>{<\/p>\n<p>\"name\": \"Patrick Kua\",<\/p>\n<p>\"talk\": \"Thoughtworks\",<\/p>\n<p>\"date\": \"05\/12\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"2\"<\/p>\n<p>}<\/p>\n<p>]<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>Confer\u00eancia::3<\/p>\n<p>{<\/p>\n<p>\"t\u00edtulo\": \"ReInvent\",<\/p>\n<p>\"Tipo\": \"Confer\u00eancia\",<\/p>\n<p>\"localiza\u00e7\u00e3o\": \"Las Vegas\",<\/p>\n<p>\"start\": \"11\/28\/2017\",<\/p>\n<p>\"end\": \"11\/30\/2017\",<\/p>\n<p>\"t\u00f3picos\": [<\/p>\n<p>\"aws\",<\/p>\n<p>\"sem servidor\",<\/p>\n<p>\"microsservi\u00e7os\",<\/p>\n<p>\"computa\u00e7\u00e3o em nuvem\",<\/p>\n<p>\"realidade aumentada\"<\/p>\n<p>],<\/p>\n<p>\"participantes\": 30000,<\/p>\n<p>\"summary\": \"Aamazon web services reInvent 2017 promete um local maior, mais sess\u00f5es e um foco em tecnologias como microsservi\u00e7os e Lambda.\",<\/p>\n<p>\"social\": {<\/p>\n<p>\"facebook\": \"https:\/\/www.facebook.com\/reinvent\",<\/p>\n<p>\"twitter\": \"https:\/\/www.twitter.com\/reinvent\"<\/p>\n<p>},<\/p>\n<p>\"alto-falantes\": [<\/p>\n<p>{<\/p>\n<p>\"name\": \"Ryan K\",<\/p>\n<p>\"talk\": \"Amazon Alexa\",<\/p>\n<p>\"date\": \"11\/28\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"2.5\"<\/p>\n<p>},<\/p>\n<p>{<\/p>\n<p>\"name\": \"Anthony J\",<\/p>\n<p>\"talk\": \"Lambda\",<\/p>\n<p>\"date\": \"11\/29\/2017\",<\/p>\n<p>\"dura\u00e7\u00e3o\": \"1.5\"<\/p>\n<p>}<\/p>\n<p>]<\/p>\n<p>}<\/p>\n<h4>Chamando a pesquisa de texto completo a partir do c\u00f3digo Java<\/h4>\n<h5>Conectar-se ao bucket do Couchbase a partir do c\u00f3digo<\/h5>\n<p>O Spring boot oferece uma maneira conveniente de se conectar ao ambiente do Couchbase, permitindo especificar determinados detalhes do ambiente do Couchbase como uma configura\u00e7\u00e3o do Spring. Normalmente, especificamos os seguintes par\u00e2metros no arquivo application.properties:<\/p>\n<p>spring.couchbase.bootstrap-hosts=127.0.0.1<br \/>\nspring.couchbase.bucket.name=conference<br \/>\nspring.couchbase.bucket.password=<\/p>\n<p>Aqui, especifiquei meu IP localhost, pois estou executando o Couchbase Server no meu laptop. Observa\u00e7\u00e3o: Voc\u00ea pode executar o Couchbase como um cont\u00eainer do Docker fornecendo o endere\u00e7o IP do cont\u00eainer.<\/p>\n<p>O nome do bucket deve corresponder ao nome do bucket criado usando o console do Couchbase.<\/p>\n<p>Tamb\u00e9m podemos especificar um cluster de endere\u00e7os IP como bootstrap-hosts. O Spring fornecer\u00e1 um cluster de ambiente do Couchbase com todos os n\u00f3s que executam o Couchbase neles. Se uma senha foi configurada quando o bucket foi criado, podemos especific\u00e1-la tamb\u00e9m; caso contr\u00e1rio, deixe esse campo vazio. No nosso caso, deixamos em branco.<\/p>\n<p>Para executar a consulta em nosso bucket desejado, primeiro precisamos ter uma refer\u00eancia ao objeto bucket. E a configura\u00e7\u00e3o do spring-couchbase faz todo o trabalho pesado nos bastidores para n\u00f3s. Tudo o que precisamos fazer \u00e9 injetar o bucket no construtor da classe do bean de servi\u00e7o do Spring.<\/p>\n<p>Aqui est\u00e1 o c\u00f3digo:<\/p>\n<p><code><br \/>\n@Servi\u00e7o<\/code><\/p>\n<p>classe p\u00fablica FullTextSearchService {<\/p>\n<p>balde privado bucket;<\/p>\n<p>public FullTextSearchService(Bucket bucket) {<\/p>\n<p>this.bucket = bucket;<\/p>\n<p>log.info(\"******** Bucket :: = \" + bucket.name());<\/p>\n<p>}<\/p>\n<p>public void findByTextMatch(String searchText) throws Exception {<\/p>\n<p>SearchQueryResult result = getBucket().query(<\/p>\n<p>new SearchQuery(FtsConstants.FTS_IDX_CONF, SearchQuery.matchPhrase(searchText)).fields(\"summary\"));<\/p>\n<p>para (SearchQueryRow hit : result.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" e conte\u00fado := \"<\/p>\n<p>+ bucket.get(hit.id()).content().get(\"title\"));<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Tamb\u00e9m podemos personalizar alguns dos par\u00e2metros de configura\u00e7\u00e3o do CouchbaseEnvironment. Para obter uma lista detalhada dos par\u00e2metros que podemos personalizar, d\u00ea uma olhada no seguinte <a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/boot-features-nosql.html\">diretrizes de refer\u00eancia<\/a>:<\/p>\n<p>Nesse ponto, podemos chamar o servi\u00e7o a partir do <em>CommandLineRunner <\/em>feij\u00e3o.<\/p>\n<p><code><br \/>\n@Configura\u00e7\u00e3o<\/code><\/p>\n<p>public class FtsRunner implements CommandLineRunner {<\/p>\n<p>@Autowired<\/p>\n<p>FullTextSearchService fts;<\/p>\n<p>@Override<\/p>\n<p>public void run(String... arg0) throws Exception {<\/p>\n<p>fts.findByTextMatch(\"developer\");<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<h5>Uso do servi\u00e7o de pesquisa de texto completo<\/h5>\n<p>No n\u00facleo do Java SDK, o Couchbase oferece <em>consulta()<\/em>\u00a0como uma forma de consultar em um bucket especificado. Se voc\u00ea estiver familiarizado com o N1QL Query ou View Query, ent\u00e3o o m\u00e9todo <em>consulta() <\/em>oferece um padr\u00e3o semelhante; a \u00fanica diferen\u00e7a para o Search \u00e9 que ele aceita um <em>Pesquisa <\/em>como um argumento.<\/p>\n<p>A seguir, o c\u00f3digo que pesquisa um determinado texto no compartimento \"conference\". <em>getBucket() <\/em>retorna um identificador do balde.<\/p>\n<p>Ao criar uma SearchQuery, \u00e9 necess\u00e1rio fornecer o nome do \u00edndice que foi criado na se\u00e7\u00e3o Configura\u00e7\u00e3o acima. Aqui, estou usando \"conference-search\" como o \u00edndice especificado em FtsConstants.FTS_IDX_CONF. A prop\u00f3sito, o c\u00f3digo-fonte completo do aplicativo foi carregado no GitHub e est\u00e1 dispon\u00edvel para download. O link est\u00e1 no final da postagem.<\/p>\n<p><code><br \/>\npublic static void findByTextMatch(String searchText) throws Exception {<\/code><\/p>\n<p>SearchQueryResult result = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, SearchQuery.matchPhrase(searchText)).fields(\"summary\"));<\/p>\n<p>log.info(\"****** total hits := \"+ result.hits().size());<\/p>\n<p>para (SearchQueryRow hit : result.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" e conte\u00fado := \"+ bucket.get(hit.id()).content().get(\"title\"));<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>O c\u00f3digo acima est\u00e1 pesquisando no campo \"summary\" dos documentos no bucket usando o <em>matchPhrase(searchText) <\/em>m\u00e9todo.<\/p>\n<p>O c\u00f3digo \u00e9 chamado por uma simples chamada:<\/p>\n<p><em>findByTextMatch(\"developer\");<\/em><\/p>\n<p>Portanto, a pesquisa de texto completo deve retornar todos os documentos no intervalo de confer\u00eancias que tenham o texto \"developer\" no campo de resumo. Aqui est\u00e1 o resultado:<\/p>\n<p>Confer\u00eancia de balde aberto<\/p>\n<p>****** total hits := 1<\/p>\n<p>****** score := 0.036940739161339185 e conte\u00fado := Devoxx UK<\/p>\n<p>O total de acertos representa o n\u00famero total de correspond\u00eancias encontradas. Aqui \u00e9 1 e a pontua\u00e7\u00e3o correspondente dessa correspond\u00eancia tamb\u00e9m pode ser encontrada. O c\u00f3digo n\u00e3o imprime o documento inteiro, apenas o t\u00edtulo da confer\u00eancia. Voc\u00ea pode imprimir os outros atributos do documento, se desejar.<\/p>\n<p>H\u00e1 outras maneiras de usar o SearchQuery que ser\u00e3o discutidas a seguir.<\/p>\n<h4>Pesquisa de texto difuso<\/h4>\n<p>Voc\u00ea pode realizar uma consulta difusa especificando um valor m\u00e1ximo de <u><a href=\"https:\/\/en.wikipedia.org\/wiki\/Levenshtein_distance\" target=\"_blank\" rel=\"noopener\">Dist\u00e2ncia de Levenshtein<\/a><\/u>\u00a0como o m\u00e1ximo de fuzziness() a ser permitido no termo. A imprecis\u00e3o padr\u00e3o \u00e9 2.<\/p>\n<p>Por exemplo, digamos que eu queira encontrar a confer\u00eancia em que \"sysops\" seja um dos \"t\u00f3picos\". No conjunto de dados acima, voc\u00ea pode ver que n\u00e3o h\u00e1 nenhum t\u00f3pico \"sysops\" presente em nenhuma das confer\u00eancias. A correspond\u00eancia mais pr\u00f3xima \u00e9 \"devops\"; no entanto, essa dist\u00e2ncia \u00e9 de 3 Levenshtein. Portanto, se eu executar o c\u00f3digo a seguir com a imprecis\u00e3o 1 ou 2, ele n\u00e3o dever\u00e1 apresentar nenhum resultado, o que n\u00e3o acontece.<\/p>\n<p><code><br \/>\nSearchQueryResult resultFuzzy = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, SearchQuery.match(searchText).fuzziness(<strong>2<\/strong>)).fields(\"topics\"));<\/code><\/p>\n<p>log.info(\"****** total hits := \"+ resultFuzzy.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultFuzzy.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" e conte\u00fado := \"+ bucket.get(hit.id()).content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>findByTextFuzzy(\"sysops\"); fornece o seguinte resultado:<\/p>\n<p><strong>total de acertos := 0<\/strong><\/p>\n<p>Agora, se eu alterar a imprecis\u00e3o para \"3\" e invocar o mesmo c\u00f3digo novamente, recebo um documento de volta. Aqui vai:<\/p>\n<p><strong>\u00a0****** total hits := 1<\/strong><\/p>\n<p>****** score := 0.016616112953992054 and content := [\"containers\",\"<strong>devops<\/strong>\", \"microsservi\u00e7os\", \"desenvolvimento de produtos\", \"virtualiza\u00e7\u00e3o\"]<\/p>\n<p>Como \"devops\" corresponde a \"sysops\" com uma imprecis\u00e3o de 3, a pesquisa \u00e9 capaz de encontrar o documento.<\/p>\n<h4>Consulta de express\u00e3o regular<\/h4>\n<p>Voc\u00ea pode fazer consultas baseadas em express\u00f5es regulares usando o SearchQuery. O c\u00f3digo a seguir faz uso da fun\u00e7\u00e3o <em>RegExpQuery <\/em>para pesquisar \"t\u00f3picos\" com base em um padr\u00e3o fornecido.<br \/>\n<code><br \/>\nRegexpQuery rq = new RegexpQuery(regexp).field(\"topics\");<\/code><\/p>\n<p>SearchQueryResult resultRegExp = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, rq));<\/p>\n<p>log.info(\"****** total hits := \"+ resultRegExp.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultRegExp.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" e conte\u00fado := \"+ bucket.get(hit.id()).content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>Quando invocado como<\/p>\n<p>findByRegExp(\"[a-z]*\\\\s*reality\");<\/p>\n<p>Ele retorna os dois documentos a seguir:<\/p>\n<p><strong>****** total de acertos := 2<\/strong><\/p>\n<p>****** score := 0.11597946228887497 and content := [\"aws\", \"serverless\", \"microservices\", \"cloud computing\",\"<strong>realidade aumentada<\/strong>&#8220;]<\/p>\n<p>****** score := 0.1084888528694293 and content := [\"cloud\", \"iot\", \"big data\", \"machine learning\",\"<strong>realidade virtual<\/strong>&#8220;]<\/p>\n<h4>Consulta por prefixo<\/h4>\n<p>O Couchbase permite que voc\u00ea fa\u00e7a consultas com base em um \"prefixo\" de um elemento de texto. A API pesquisa os textos que come\u00e7am com o prefixo especificado. O c\u00f3digo \u00e9 simples de usar; ele pesquisa no campo \"summary\" do documento os textos que t\u00eam o prefixo fornecido.<\/p>\n<p><code><br \/>\nPrefixQuery pq = new PrefixQuery(prefix).field(\"summary\");<\/code><\/p>\n<p>SearchQueryResult resultPrefix = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, pq).fields(\"summary\"));<\/p>\n<p>log.info(\"****** total hits := \"+ resultPrefix.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultPrefix.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" e conte\u00fado := \"+ bucket.get(hit.id()).content().get(\"summary\"));<\/p>\n<p>}<\/p>\n<p>Se voc\u00ea invocar o c\u00f3digo como findByPrefix(\"micro\");<\/p>\n<p>Voc\u00ea obt\u00e9m o seguinte resultado:<\/p>\n<p><strong>\u00a0****** total hits := 1<\/strong><\/p>\n<p>****** score := 0.08200986407165835 and content := Aamazon web services reInvent 2017 promete um local maior, mais sess\u00f5es e um foco em tecnologias como <strong>microsservi\u00e7os<\/strong>\u00a0e Lambda.<\/p>\n<h4>Consulta por frase<\/h4>\n<p>O c\u00f3digo a seguir permite que voc\u00ea consulte uma frase em um texto.<\/p>\n<p><code><br \/>\nMatchPhraseQuery mpq = novo MatchPhraseQuery(matchPhrase).field(\"speakers.talk\");<\/code><\/p>\n<p>SearchQueryResult resultPrefix = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, mpq).fields(\"speakers.talk\"));<\/p>\n<p>log.info(\"****** total hits := \"+ resultPrefix.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultPrefix.hits()) {<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" and content := \"+ bucket.get(hit.id()).content().get(\"title\") + \" speakers = \"+bucket.get(hit.id()).content().get(\"speakers\"));<\/p>\n<p>}<\/p>\n<p>Aqui, a consulta est\u00e1 procurando uma frase no campo \"speakers.talk\" e retorna a correspond\u00eancia, se encontrada.<\/p>\n<p>Um exemplo de invoca\u00e7\u00e3o do c\u00f3digo acima com<\/p>\n<p>findByMatchPhrase(\"Docker with couchbase\") fornece o seguinte resultado esperado:<\/p>\n<p><strong>****** total hits := 1<\/strong><\/p>\n<p>****** score := 0.25054427342401087 and content := DockerCon speakers = [{\"duration\": \"2\u2033, \"date\": \"04\/18\/2017\u2033, \"talk\":\"<strong>Docker com couchbase<\/strong>\", \"name\": \"Arun Gupta\"},{\"duration\": \"2\u2033, \"date\": \"04\/19\/2017\u2033, \"talk\": \"Opensource\", \"name\": \"Laura Frank\"}]<\/p>\n<h4>Consulta de intervalo<\/h4>\n<p>A pesquisa de texto completo tamb\u00e9m \u00e9 bastante \u00fatil quando se trata de pesquisa baseada em intervalo, seja um intervalo num\u00e9rico ou at\u00e9 mesmo um intervalo de datas. Por exemplo, se voc\u00ea quiser descobrir a(s) confer\u00eancia(s) em que o n\u00famero de participantes est\u00e1 dentro de um intervalo, poder\u00e1 fazer isso facilmente,<\/p>\n<p>findByNumberRange(5000, 30000);<\/p>\n<p>Aqui, o primeiro argumento \u00e9 o m\u00ednimo do intervalo e o segundo argumento \u00e9 o m\u00e1ximo do intervalo.<\/p>\n<p>Aqui est\u00e1 o c\u00f3digo que \u00e9 acionado:<\/p>\n<p><code><br \/>\nNumericRangeQuery nrq = new NumericRangeQuery().min(min).max(max).field(\"attendees\");<\/code><\/p>\n<p>SearchQueryResult resultPrefix = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, nrq).fields(\"title\", \"attendees\", \"location\"));<\/p>\n<p>log.info(\"****** total hits := \"+ resultPrefix.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultPrefix.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** score := \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" location := \" + row.content().get(\"location\"));<\/p>\n<p>}<\/p>\n<p>O resultado \u00e9 o seguinte: as confer\u00eancias que t\u00eam participantes entre o intervalo fornecido s\u00e3o retornadas.<\/p>\n<p><strong>\u00a0****** total de acertos := 2<\/strong><\/p>\n<p>****** score := 5.513997563179222E-5 and title := <strong>Participantes da DockerCon := 20000<\/strong>\u00a0local := Austin<\/p>\n<p>****** score := 5.513997563179222E-5 and title := <strong>Participantes da Devoxx UK := 10000<\/strong>\u00a0localiza\u00e7\u00e3o := B\u00e9lgica<\/p>\n<h4>Consulta de combina\u00e7\u00e3o<\/h4>\n<p>O servi\u00e7o de pesquisa de texto completo do Couchbase permite que voc\u00ea use uma combina\u00e7\u00e3o de consultas de acordo com sua necessidade. Para demonstrar isso, vamos primeiro invocar a API fornecendo dois argumentos.<\/p>\n<p>findByMatchCombination(\"aws\", \"containers\");<\/p>\n<p>Aqui, o c\u00f3digo do cliente est\u00e1 tentando usar a pesquisa combinada com base em \"aws\" e \"containers\". Vamos dar uma olhada na API de consulta agora.<\/p>\n<p><code><br \/>\nMatchQuery mq1 = new MatchQuery(text1).field(\"topics\");<\/code><\/p>\n<p>MatchQuery mq2 = new MatchQuery(text2).field(\"topics\");<\/p>\n<p>SearchQueryResult match1Result = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, mq1).fields(\"title\", \"attendees\", \"location\", \"topics\"));<\/p>\n<p>log.info(\"****** total de ocorr\u00eancias para match1 := \"+ match1Result.hits().size());<\/p>\n<p>para (SearchQueryRow hit : match1Result.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** scores for match 1 := \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" topics := \" + row.content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>SearchQueryResult match2Result = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, mq2).fields(\"title\", \"attendees\", \"location\", \"topics\"));<\/p>\n<p>log.info(\"****** total de ocorr\u00eancias para match2 := \"+ match2Result.hits().size());<\/p>\n<p>para (SearchQueryRow hit : match2Result.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** scores for match 2:= \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" topics := \" + row.content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>ConjunctionQuery conjunction = new ConjunctionQuery(mq1, mq2);<\/p>\n<p>SearchQueryResult result = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, conjunction).fields(\"title\", \"attendees\", \"location\", \"topics\"));<\/p>\n<p>log.info(\"****** total de ocorr\u00eancias para a consulta de conjun\u00e7\u00e3o := \"+ result.hits().size());<\/p>\n<p>para (SearchQueryRow hit : result.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** scores for conjunction query:= \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" topics := \" + row.content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>DisjunctionQuery dis = new DisjunctionQuery(mq1, mq2);<\/p>\n<p>SearchQueryResult resultDis = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, dis).fields(\"title\", \"attendees\", \"location\", \"topics\"));<\/p>\n<p>log.info(\"****** total de ocorr\u00eancias para a consulta de disjun\u00e7\u00e3o := \"+ resultDis.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultDis.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** scores for disjunction query:= \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" topics := \" + row.content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>BooleanQuery bool = new BooleanQuery().must(mq1).mustNot(mq2);<\/p>\n<p>SearchQueryResult resultBool = getBucket().query(new SearchQuery(FtsConstants.FTS_IDX_CONF, bool).fields(\"title\", \"attendees\", \"location\", \"topics\"));<\/p>\n<p>log.info(\"****** total de ocorr\u00eancias para a consulta booelan := \"+ resultBool.hits().size());<\/p>\n<p>para (SearchQueryRow hit : resultBool.hits()) {<\/p>\n<p>JsonDocument row = bucket.get(hit.id());<\/p>\n<p>log.info(\"****** scores for resultBool query:= \" + hit.score() + \" and title := \"+ row.content().get(\"title\") + \" attendees := \"+ row.content().get(\"attendees\") + \" topics := \" + row.content().get(\"topics\"));<\/p>\n<p>}<\/p>\n<p>Primeiro, as correspond\u00eancias individuais s\u00e3o encontradas com base nos textos. Encontramos os documentos do conjunto de resultados que correspondem a \"aws\" como um dos t\u00f3picos da confer\u00eancia. Da mesma forma, encontramos os documentos que t\u00eam \"containers\" como t\u00f3picos.<\/p>\n<p>Em seguida, come\u00e7amos a combinar os resultados individuais para formar consultas combinadas.<\/p>\n<h4>Consulta de conjun\u00e7\u00e3o<\/h4>\n<p>A consulta de conjun\u00e7\u00e3o retornaria todas as confer\u00eancias correspondentes que t\u00eam \"aws\" e \"containers\" listados como t\u00f3picos. Nosso conjunto de dados atual ainda n\u00e3o tem uma confer\u00eancia desse tipo; portanto, como esperado, quando executamos a consulta, n\u00e3o recebemos nenhum documento correspondente.<\/p>\n<p>****** total de ocorr\u00eancias para match1 := 1 - isso corresponde a \"aws\"<\/p>\n<p>****** pontua\u00e7\u00f5es para a correspond\u00eancia 1 := 0,11597946228887497 e t\u00edtulo := ReInvent participantes := 30000 t\u00f3picos := [\"aws\", \"serverless\", \"microservices\", \"cloud computing\", \"augmented reality\"]<\/p>\n<p>****** total de ocorr\u00eancias para match2 := 1 - isso corresponde a \"containers\"<\/p>\n<p>****** scores for match 2:= 0.12527214351929328 and title := DockerCon attendees := 20000 topics := [\"containers\", \"devops\", \"microservices\", \"product development\", \"virtualization\"]<\/p>\n<p>******<strong>\u00a0total de ocorr\u00eancias para a consulta de conjun\u00e7\u00e3o := 0<\/strong><\/p>\n<h4>Consulta de disjun\u00e7\u00e3o<\/h4>\n<p>A consulta de disjun\u00e7\u00e3o retornaria todas as confer\u00eancias correspondentes se qualquer uma das consultas candidatas retornasse uma correspond\u00eancia. Como cada uma das consultas de correspond\u00eancia individual retorna uma confer\u00eancia cada, quando executamos nossa consulta de disjun\u00e7\u00e3o, obtemos ambos os resultados.<\/p>\n<p>****** <strong>total de ocorr\u00eancias para a consulta de disjun\u00e7\u00e3o := 2<\/strong><\/p>\n<p>****** pontua\u00e7\u00f5es para consulta de disjun\u00e7\u00e3o:= 0,018374455634478874 e t\u00edtulo := DockerCon participantes := 20000 t\u00f3picos := [\"<strong>cont\u00eaineres<\/strong>\", \"devops\", \"microsservi\u00e7os\", \"desenvolvimento de produtos\", \"virtualiza\u00e7\u00e3o\"]<\/p>\n<p>****** pontua\u00e7\u00f5es para consulta de disjun\u00e7\u00e3o:= 0,01701143945069833 e t\u00edtulo := ReInvent participantes := 30000 t\u00f3picos := [\"<strong>aws<\/strong>\", \"sem servidor\", \"microsservi\u00e7os\", \"computa\u00e7\u00e3o em nuvem\", \"realidade aumentada\"]<\/p>\n<h4>Consulta booleana<\/h4>\n<p>Usando a consulta bBoolean, podemos combinar diferentes combina\u00e7\u00f5es de consultas de correspond\u00eancia. Por exemplo, BooleanQuery bool = new BooleanQuery().must(mq1).mustNot(mq2) retorna todas as confer\u00eancias que devem corresponder ao resultado da consulta do primeiro termo, que \u00e9 mq1, e, ao mesmo tempo, n\u00e3o devem corresponder a mq2. Voc\u00ea pode inverter a combina\u00e7\u00e3o.<\/p>\n<p>O resultado do nosso c\u00f3digo \u00e9 o seguinte:<\/p>\n<p>****** <strong>total de ocorr\u00eancias para a consulta booelan := 1<\/strong><\/p>\n<p>****** pontua\u00e7\u00f5es para resultBool query:= 0.11597946228887497 e title := ReInvent attendees := 30000 topics := [\"<strong>aws<\/strong>\", \"sem servidor\", \"microsservi\u00e7os\", \"computa\u00e7\u00e3o em nuvem\", \"realidade aumentada\"]<\/p>\n<p>Ele retorna a confer\u00eancia que tem um t\u00f3pico chamado \"aws\" (que, a prop\u00f3sito, \u00e9 o mesmo que mq1) e n\u00e3o tem um t\u00f3pico chamado \"containers\" (ou seja, mq2). A \u00fanica confer\u00eancia que atende a essas duas condi\u00e7\u00f5es \u00e9 a intitulada \"ReInvent\", que \u00e9 retornada como sa\u00edda.<\/p>\n<p>Espero que a postagem tenha sido \u00fatil para voc\u00ea. O c\u00f3digo-fonte pode ser encontrado <a href=\"https:\/\/github.com\/ratchakr\/fts_demo_cb\">on-line<\/a>. Para obter uma ideia geral sobre o servi\u00e7o de pesquisa de texto completo do Couchbase, consulte o seguinte <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-4-5-developer-preview-couchbase-fts\/\">postagem no blog<\/a> para obter algumas percep\u00e7\u00f5es \u00fateis:<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>A pesquisa baseada em texto completo \u00e9 um recurso que permite que os usu\u00e1rios pesquisem com base em textos e palavras-chave, e \u00e9 muito popular entre os usu\u00e1rios e a comunidade de desenvolvedores. Portanto, \u00e9 \u00f3bvio que existem muitas APIs e estruturas que oferecem pesquisa de texto completo, incluindo Apache Solr, Lucene e Elasticsearch, s\u00f3 para citar alguns. O Couchbase, um dos principais gigantes do NoSQL, come\u00e7ou a implementar esse recurso na vers\u00e3o 4.5 do Couchbase Server. Neste post, descreverei como integrar o servi\u00e7o de pesquisa de texto completo em seu aplicativo usando o Couchbase Java SDK.<\/p>","protected":false},"author":53,"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,1812],"tags":[1630],"ppma_author":[9026],"class_list":["post-2871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-full-text-search","category-java","category-n1ql-query","tag-spring-boot"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using Couchbase FTS in Java - 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\/using-couchbase-full-text-search-service-java\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Couchbase Full Text Search Service in Java\" \/>\n<meta property=\"og:description\" content=\"Full-text based search is a feature that allows users to search based on texts and keywords, and is very popular among users and the developer community. So it\u2019s a no-brainer that there are lots of APIs and frameworks that offer full-text search, including Apache Solr, Lucene, and Elasticsearch, just to name a few. Couchbase, one of the leading NoSQL giants, started rolling out this feature in their Couchbase Server 4.5 release. In this post, I am going to describe how to integrate the full-text search service into their application using the Couchbase Java SDK.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-full-text-search-service-java\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-01T16:46:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:28:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/pasted-image-0.png\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Using Couchbase Full Text Search Service in Java\",\"datePublished\":\"2017-03-01T16:46:35+00:00\",\"dateModified\":\"2025-06-14T03:28:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/\"},\"wordCount\":2789,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring-boot\"],\"articleSection\":[\"Couchbase Server\",\"Full-Text Search\",\"Java\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/\",\"name\":\"Using Couchbase FTS in Java - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-03-01T16:46:35+00:00\",\"dateModified\":\"2025-06-14T03:28:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#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\/using-couchbase-full-text-search-service-java\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Couchbase Full Text Search Service in Java\"}]},{\"@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\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laura-czajkowski\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using Couchbase FTS in Java - 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\/using-couchbase-full-text-search-service-java\/","og_locale":"pt_BR","og_type":"article","og_title":"Using Couchbase Full Text Search Service in Java","og_description":"Full-text based search is a feature that allows users to search based on texts and keywords, and is very popular among users and the developer community. So it\u2019s a no-brainer that there are lots of APIs and frameworks that offer full-text search, including Apache Solr, Lucene, and Elasticsearch, just to name a few. Couchbase, one of the leading NoSQL giants, started rolling out this feature in their Couchbase Server 4.5 release. In this post, I am going to describe how to integrate the full-text search service into their application using the Couchbase Java SDK.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/using-couchbase-full-text-search-service-java\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-03-01T16:46:35+00:00","article_modified_time":"2025-06-14T03:28:13+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/pasted-image-0.png","type":"","width":"","height":""}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Using Couchbase Full Text Search Service in Java","datePublished":"2017-03-01T16:46:35+00:00","dateModified":"2025-06-14T03:28:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/"},"wordCount":2789,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring-boot"],"articleSection":["Couchbase Server","Full-Text Search","Java","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/","url":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/","name":"Using Couchbase FTS in Java - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-03-01T16:46:35+00:00","dateModified":"2025-06-14T03:28:13+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/using-couchbase-full-text-search-service-java\/#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\/using-couchbase-full-text-search-service-java\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using Couchbase Full Text Search Service in Java"}]},{"@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, gerente da comunidade de desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski \u00e9 a Snr. Developer Community Manager da Couchbase, supervisionando a comunidade. Ela \u00e9 respons\u00e1vel pelo nosso boletim informativo mensal para desenvolvedores.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laura-czajkowski\/"}]}},"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","first_name":"Laura","last_name":"Czajkowski","user_url":"","author_category":"","description":"Laura Czajkowski \u00e9 a Snr. Developer Community Manager da Couchbase, supervisionando a comunidade. Ela \u00e9 respons\u00e1vel pelo nosso boletim informativo mensal para desenvolvedores."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2871","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\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2871"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2871\/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=2871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2871"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}