{"id":5866,"date":"2018-10-09T00:44:26","date_gmt":"2018-10-09T07:44:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5866"},"modified":"2023-02-07T09:46:10","modified_gmt":"2023-02-07T17:46:10","slug":"fuzzy-matching","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/fuzzy-matching\/","title":{"rendered":"O que \u00e9 Fuzzy Matching e como us\u00e1-lo corretamente"},"content":{"rendered":"<p>Voc\u00ea j\u00e1 se perguntou: \"O que \u00e9 fuzzy matching?\" A correspond\u00eancia difusa permite que voc\u00ea identifique correspond\u00eancias n\u00e3o exatas do seu item de destino. \u00c9 a pedra fundamental de muitas estruturas de mecanismos de pesquisa e um dos principais motivos pelos quais voc\u00ea pode obter resultados de pesquisa relevantes mesmo que tenha um erro de digita\u00e7\u00e3o na consulta ou um tempo verbal diferente.<\/p>\n<p>Como era de se esperar, h\u00e1 muitos algoritmos de busca difusa que podem ser usados para texto, mas praticamente todas as estruturas de mecanismos de busca (incluindo <a href=\"https:\/\/blevesearch.com\/\">sangrar<\/a>) usam principalmente a dist\u00e2ncia Levenshtein para correspond\u00eancia de strings difusas:<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Dist\u00e2ncia de Levenshtein<\/strong><\/h3>\n<p>Tamb\u00e9m conhecido como <strong>Editar dist\u00e2ncia<\/strong>\u00e9 o n\u00famero de transforma\u00e7\u00f5es (exclus\u00f5es, inser\u00e7\u00f5es ou substitui\u00e7\u00f5es) necess\u00e1rias para transformar uma cadeia de caracteres de origem na cadeia de caracteres de destino. Para um exemplo de pesquisa difusa, se o termo de destino for \"book\" e a fonte for \"back\", voc\u00ea precisar\u00e1 alterar o primeiro \"o\" para \"a\" e o segundo \"o\" para \"c\", o que nos dar\u00e1 uma dist\u00e2ncia de Levenshtein de 2.<a href=\"https:\/\/rosettacode.org\/wiki\/Levenshtein_distance\">Voc\u00ea pode encontrar implementa\u00e7\u00f5es de Levenshtein em JavaScript, Kotlin, Java e muitos outros aqui<\/a>).<\/p>\n<p>Al\u00e9m disso, algumas estruturas tamb\u00e9m suportam a dist\u00e2ncia Damerau-Levenshtein:<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Dist\u00e2ncia Damerau-Levenshtein<\/strong><\/h3>\n<p>\u00c9 uma extens\u00e3o da dist\u00e2ncia de Levenshtein, permitindo uma opera\u00e7\u00e3o extra: <strong><em>Transposi\u00e7\u00e3o<\/em><\/strong>\u00a0de dois caracteres adjacentes:<\/p>\n<p><strong>Ex: <\/strong>TSAR para STAR<\/p>\n<p><strong>Dist\u00e2ncia Damerau-Levenshtein = <\/strong>1 (A troca das posi\u00e7\u00f5es S e T custa apenas uma opera\u00e7\u00e3o)<\/p>\n<p><strong>Dist\u00e2ncia de Levenshtein = 2\u00a0<\/strong> (Substituir S por T e T por S)<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Correspond\u00eancia e relev\u00e2ncia difusa<\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p>A correspond\u00eancia difusa tem um grande efeito colateral: ela prejudica a relev\u00e2ncia. Embora Damerau-Levenshtein seja um algoritmo de correspond\u00eancia difusa que considera a maioria dos erros ortogr\u00e1ficos comuns do usu\u00e1rio, ele tamb\u00e9m pode incluir um n\u00famero significativo de <strong>falsos positivos<\/strong>especialmente quando estamos usando uma linguagem com um <a href=\"https:\/\/www.wolframalpha.com\/input\/?i=average+english+word+length\">m\u00e9dia de apenas 5 letras por palavra<\/a>como o ingl\u00eas. \u00c9 por isso que a maioria das estruturas dos mecanismos de busca prefere usar a dist\u00e2ncia de Levenshtein. Vamos ver um exemplo real de correspond\u00eancia fuzzy:<\/p>\n<p>Primeiro, vamos usar <a href=\"https:\/\/github.com\/deniswsrosa\/movies_dataset\">esse conjunto de dados do cat\u00e1logo de filmes<\/a>. Eu o recomendo muito se voc\u00ea quiser brincar com a pesquisa de texto completo. Em seguida, vamos pesquisar filmes com \"<strong>livro<\/strong>\" no t\u00edtulo. Um c\u00f3digo simples seria parecido com o seguinte:<\/p>\n<pre class=\"lang:java decode:true\">String indexName = \"movies_index\";\r\nMatchQuery query = SearchQuery.match(\"book\").field(\"title\");\r\nSearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\nnew SearchQuery(indexName, query).highlight().limit(6));\r\n\r\nprintResults(movies);<\/pre>\n<p>O c\u00f3digo acima produzir\u00e1 os seguintes resultados:<\/p>\n<pre class=\"lang:default decode:true\">1) The Book Thief\r\n     score: 4.826942606027416\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; Thief]\r\n          -----------------------------\r\n\r\n2) The Book of Eli\r\n     score: 4.826942606027416\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Eli]\r\n          -----------------------------\r\n\r\n3) The Book of Life\r\n     score: 4.826942606027416\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Life]\r\n          -----------------------------\r\n\r\n4) Black Book\r\n     score: 4.826942606027416\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[Black &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n5) The Jungle Book\r\n     score: 4.826942606027416\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n6) The Jungle Book 2\r\n     score: 3.9411821308689627\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt; 2]\r\n          -----------------------------\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Por padr\u00e3o, os resultados n\u00e3o diferenciam mai\u00fasculas de min\u00fasculas, mas voc\u00ea pode alterar facilmente esse comportamento criando novos \u00edndices com analisadores diferentes.<\/p>\n<p>Agora, vamos adicionar um recurso de correspond\u00eancia difusa \u00e0 nossa consulta, definindo a imprecis\u00e3o como 1 (dist\u00e2ncia de Levenshtein 1), o que significa que \"<strong>livro<\/strong>\" e \"<strong>olhar<\/strong>\" ter\u00e1 a mesma relev\u00e2ncia.<\/p>\n<pre class=\"lang:java decode:true\">String indexName = \"movies_index\";\r\nMatchQuery query = SearchQuery.match(\"book\").field(\"title\").fuzziness(1);\r\nSearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\nnew SearchQuery(indexName, query).highlight().limit(6));\r\n\r\nprintResults(movies);<\/pre>\n<p>E aqui est\u00e1 o resultado da pesquisa difusa:<\/p>\n<pre class=\"lang:default decode:true\">1) Hook\r\n     score: 1.1012248063242538\r\n     Hit Locations: \r\n          field:title\r\n          term:hook\r\n          fragment:[&lt;mark&gt;Hook&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n2) Here Comes the Boom\r\n     score: 0.7786835148361213\r\n     Hit Locations: \r\n          field:title\r\n          term:boom\r\n          fragment:[Here Comes the &lt;mark&gt;Boom&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n3) Look Who's Talking Too\r\n     score: 0.7047266634351538\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking Too]\r\n          -----------------------------\r\n\r\n4) Look Who's Talking\r\n     score: 0.7047266634351538\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking]\r\n          -----------------------------\r\n\r\n5) The Book Thief\r\n     score: 0.5228811753737184\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; Thief]\r\n          -----------------------------\r\n\r\n6) The Book of Eli\r\n     score: 0.5228811753737184\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Eli]\r\n          -----------------------------\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Agora, o filme chamado \"<strong>Gancho<\/strong>\" \u00e9 o primeiro resultado da pesquisa, que pode n\u00e3o ser exatamente o que o usu\u00e1rio est\u00e1 esperando em uma pesquisa por \"<strong>Livro<\/strong>\".<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>Como minimizar os falsos positivos durante as pesquisas difusas<\/strong><\/h3>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>\u00a0<\/strong>Em um mundo ideal, os usu\u00e1rios nunca cometeriam erros de digita\u00e7\u00e3o ao pesquisar algo. No entanto, esse n\u00e3o \u00e9 o mundo em que vivemos e, se voc\u00ea quiser que seus usu\u00e1rios tenham uma experi\u00eancia agrad\u00e1vel, ter\u00e1 de lidar com pelo menos uma dist\u00e2ncia de edi\u00e7\u00e3o de 1. Portanto, a verdadeira quest\u00e3o \u00e9: como podemos fazer a correspond\u00eancia de strings fuzzy minimizando a perda de relev\u00e2ncia?<\/p>\n<p>Podemos tirar proveito de uma caracter\u00edstica da maioria das estruturas de mecanismos de pesquisa: Uma correspond\u00eancia com uma dist\u00e2ncia de edi\u00e7\u00e3o menor geralmente ter\u00e1 uma pontua\u00e7\u00e3o mais alta. Essa caracter\u00edstica nos permite combinar essas duas consultas com diferentes n\u00edveis de imprecis\u00e3o em uma s\u00f3:<\/p>\n<pre class=\"lang:java decode:true\">String indexName = \"movies_index\";\r\nString word = \"Book\";\r\nMatchQuery titleFuzzy = SearchQuery.match(word).fuzziness(1).field(\"title\");\r\nMatchQuery titleSimple = SearchQuery.match(word).field(\"title\");\r\nDisjunctionQuery ftsQuery = SearchQuery.disjuncts(titleSimple, titleFuzzy);\r\n\r\nSearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\nnew SearchQuery(indexName, ftsQuery).highlight().limit(20));\u00a0printResults(result);<\/pre>\n<p>Aqui est\u00e1 o resultado da consulta fuzzy acima:<\/p>\n<pre class=\"lang:default decode:true\">1) The Book Thief\r\n     score: 2.398890092610849\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; Thief]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; Thief]\r\n          -----------------------------\r\n\r\n2) The Book of Eli\r\n     score: 2.398890092610849\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Eli]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Eli]\r\n          -----------------------------\r\n\r\n3) The Book of Life\r\n     score: 2.398890092610849\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Life]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Life]\r\n          -----------------------------\r\n\r\n4) Black Book\r\n     score: 2.398890092610849\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[Black &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[Black &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n5) The Jungle Book\r\n     score: 2.398890092610849\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n6) The Jungle Book 2\r\n     score: 1.958685557004688\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt; 2]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt; 2]\r\n          -----------------------------\r\n\r\n7) National Treasure: Book of Secrets\r\n     score: 1.6962714808368062\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[National Treasure: &lt;mark&gt;Book&lt;\/mark&gt; of Secrets]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[National Treasure: &lt;mark&gt;Book&lt;\/mark&gt; of Secrets]\r\n          -----------------------------\r\n\r\n8) American Pie Presents: The Book of Love\r\n     score: 1.517191317611584\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[American Pie Presents: The &lt;mark&gt;Book&lt;\/mark&gt; of Love]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[American Pie Presents: The &lt;mark&gt;Book&lt;\/mark&gt; of Love]\r\n          -----------------------------\r\n\r\n9) Hook\r\n     score: 0.5052232518679681\r\n     Hit Locations: \r\n          field:title\r\n          term:hook\r\n          fragment:[&lt;mark&gt;Hook&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n10) Here Comes the Boom\r\n     score: 0.357246781294941\r\n     Hit Locations: \r\n          field:title\r\n          term:boom\r\n          fragment:[Here Comes the &lt;mark&gt;Boom&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n11) Look Who's Talking Too\r\n     score: 0.32331663301992025\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking Too]\r\n          -----------------------------\r\n\r\n12) Look Who's Talking\r\n     score: 0.32331663301992025\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking]\r\n          -----------------------------\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Como voc\u00ea pode ver, esse resultado est\u00e1 muito mais pr\u00f3ximo do que o usu\u00e1rio poderia esperar. Observe que estamos usando uma classe chamada DisjunctionQuery agora, pois as disjun\u00e7\u00f5es s\u00e3o equivalentes a \"<strong>OU<\/strong>\" no SQL.<\/p>\n<p>O que mais poder\u00edamos melhorar para reduzir o efeito colateral negativo de um algoritmo de correspond\u00eancia difusa? Vamos reanalisar nosso problema para entender se ele precisa de mais melhorias:<\/p>\n<p>J\u00e1 sabemos que as pesquisas difusas podem produzir alguns resultados inesperados (por exemplo, Book <strong>-&gt;<\/strong> Look, Hook). No entanto, uma pesquisa de termo \u00fanico geralmente \u00e9 uma consulta terr\u00edvel, pois mal nos d\u00e1 uma dica do que exatamente o usu\u00e1rio est\u00e1 tentando realizar.<\/p>\n<p>Mesmo o Google, que tem um dos algoritmos de pesquisa difusa mais desenvolvidos em uso, n\u00e3o sabe exatamente o que estou procurando quando pesquiso \"<strong>tabela<\/strong>\":<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5869\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/Screen-Shot-2018-10-08-at-11.45.33-AM.png\" alt=\"google search result for table\" width=\"619\" height=\"899\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-11.45.33-AM.png 619w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-11.45.33-AM-207x300.png 207w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-11.45.33-AM-300x436.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-11.45.33-AM-14x20.png 14w\" sizes=\"auto, (max-width: 619px) 100vw, 619px\" \/><\/p>\n<p>Ent\u00e3o, qual \u00e9 o tamanho m\u00e9dio das palavras-chave em uma consulta de pesquisa? Para responder a essa pergunta, mostrarei um gr\u00e1fico de <a href=\"https:\/\/www.slideshare.net\/randfish\/keepng-up-wth-seo-n-2017-beyond\/11-Keyword_Length_of_Search_Queries1Word\">Apresenta\u00e7\u00e3o de Rand Fishkin em 2016<\/a>. (Ele \u00e9 um dos gurus mais famosos do mundo de SEO)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5870\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM-1024x517.png\" alt=\"keyword length on search queries\" width=\"900\" height=\"454\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM-1024x517.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM-300x152.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM-768x388.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.18-PM.png 1158w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>De acordo com o gr\u00e1fico acima, <strong>~80%<\/strong> das consultas de pesquisa t\u00eam 2 ou mais palavras-chave, portanto, vamos tentar pesquisar o filme \"Black Book\" usando a fuzziness 1:<\/p>\n<pre class=\"lang:java decode:true\">String indexName = \"movies_index\";\r\nMatchQuery query = SearchQuery.match(\"Black Book\").field(\"title\").fuzziness(1);\r\nSearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\nnew SearchQuery(indexName, query).highlight().limit(12));\r\n\r\nprintResults(movies);<\/pre>\n<p>&nbsp;<\/p>\n<p>Resultado:<\/p>\n<pre class=\"lang:default decode:true\">1) Black Book\r\n     score: 0.6946442424065404\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[&lt;mark&gt;Black&lt;\/mark&gt; &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:black\r\n          fragment:[&lt;mark&gt;Black&lt;\/mark&gt; &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n2) Hook\r\n     score: 0.40139742528039857\r\n     Hit Locations: \r\n          field:title\r\n          term:hook\r\n          fragment:[&lt;mark&gt;Hook&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n3) Attack the Block\r\n     score: 0.2838308365090324\r\n     Hit Locations: \r\n          field:title\r\n          term:block\r\n          fragment:[Attack the &lt;mark&gt;Block&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n4) Here Comes the Boom\r\n     score: 0.2838308365090324\r\n     Hit Locations: \r\n          field:title\r\n          term:boom\r\n          fragment:[Here Comes the &lt;mark&gt;Boom&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n5) Look Who's Talking Too\r\n     score: 0.25687349813115684\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking Too]\r\n          -----------------------------\r\n\r\n6) Look Who's Talking\r\n     score: 0.25687349813115684\r\n     Hit Locations: \r\n          field:title\r\n          term:look\r\n          fragment:[&lt;mark&gt;Look&lt;\/mark&gt; Who's Talking]\r\n          -----------------------------\r\n\r\n7) Grosse Pointe Blank\r\n     score: 0.2317469073782136\r\n     Hit Locations: \r\n          field:title\r\n          term:blank\r\n          fragment:[Grosse Pointe &lt;mark&gt;Blank&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n8) The Book Thief\r\n     score: 0.19059065534780495\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; Thief]\r\n          -----------------------------\r\n\r\n9) The Book of Eli\r\n     score: 0.19059065534780495\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Eli]\r\n          -----------------------------\r\n\r\n10) The Book of Life\r\n     score: 0.19059065534780495\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of Life]\r\n          -----------------------------\r\n\r\n11) The Jungle Book\r\n     score: 0.19059065534780495\r\n     Hit Locations: \r\n          field:title\r\n          term:book\r\n          fragment:[The Jungle &lt;mark&gt;Book&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n12) Back to the Future\r\n     score: 0.17061000968368\r\n     Hit Locations: \r\n          field:title\r\n          term:back\r\n          fragment:[&lt;mark&gt;Back&lt;\/mark&gt; to the Future]\r\n          -----------------------------\r\n<\/pre>\n<p>Nada mal. Obtivemos o filme que est\u00e1vamos procurando como o primeiro resultado. No entanto, uma consulta de disjun\u00e7\u00e3o ainda traria um conjunto melhor de resultados.<\/p>\n<p>Mas, ainda assim, parece que temos uma nova propriedade interessante aqui; o efeito colateral da correspond\u00eancia de imprecis\u00e3o diminui ligeiramente \u00e0 medida que o n\u00famero de palavras-chave aumenta. Uma busca por \"<strong>Livro preto<\/strong>\" com imprecis\u00e3o <strong>1<\/strong> ainda pode trazer resultados como back look ou lack cook (algumas combina\u00e7\u00f5es com edit distance 1), mas \u00e9 improv\u00e1vel que esses sejam t\u00edtulos de filmes reais.<\/p>\n<p>Uma busca por \"<strong>livro eli<\/strong>\" com a imprecis\u00e3o 2 ainda o traria como o terceiro resultado:<\/p>\n<pre class=\"lang:java decode:true\">String indexName = \"movies_index\";\r\nMatchQuery query = SearchQuery.match(\"book eli\").field(\"title\").fuzziness(2);\r\nSearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\nnew SearchQuery(indexName, query).highlight().limit(12));\r\n\r\nprintResults(movies);<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:default decode:true\">1) Ed Wood\r\n     score: 0.030723793900031805\r\n     Hit Locations: \r\n          field:title\r\n          term:wood\r\n          fragment:[&lt;mark&gt;Ed&lt;\/mark&gt; &lt;mark&gt;Wood&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:ed\r\n          fragment:[&lt;mark&gt;Ed&lt;\/mark&gt; &lt;mark&gt;Wood&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n2) Man of Tai Chi\r\n     score: 0.0271042761982626\r\n     Hit Locations: \r\n          field:title\r\n          term:chi\r\n          fragment:[Man of &lt;mark&gt;Tai&lt;\/mark&gt; &lt;mark&gt;Chi&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:tai\r\n          fragment:[Man of &lt;mark&gt;Tai&lt;\/mark&gt; &lt;mark&gt;Chi&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n3) The Book of Eli\r\n     score: 0.02608335441670756\r\n     Hit Locations: \r\n          field:title\r\n          term:eli\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of &lt;mark&gt;Eli&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:book\r\n          fragment:[The &lt;mark&gt;Book&lt;\/mark&gt; of &lt;mark&gt;Eli&lt;\/mark&gt;]\r\n          -----------------------------\r\n\r\n4) The Good Lie\r\n     score: 0.02439822770591834\r\n     Hit Locations: \r\n          field:title\r\n          term:lie\r\n          fragment:[The &lt;mark&gt;Good&lt;\/mark&gt; &lt;mark&gt;Lie&lt;\/mark&gt;]\r\n          -----------------------------\r\n          field:title\r\n          term:good\r\n          fragment:[The &lt;mark&gt;Good&lt;\/mark&gt; &lt;mark&gt;Lie&lt;\/mark&gt;]\r\n          -----------------------------\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Entretanto, como a palavra m\u00e9dia em ingl\u00eas tem 5 letras, eu <strong>N\u00c3O<\/strong> recomendamos o uso de uma dist\u00e2ncia de edi\u00e7\u00e3o maior que 2, a menos que o usu\u00e1rio esteja pesquisando palavras longas e f\u00e1ceis de serem escritas incorretamente, como \"Schwarzenegger\", por exemplo (pelo menos para quem n\u00e3o \u00e9 alem\u00e3o ou austr\u00edaco).<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Conclus\u00e3o<\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p>Neste artigo, discutimos a correspond\u00eancia difusa e como superar seu principal efeito colateral sem prejudicar sua relev\u00e2ncia. Lembre-se de que a correspond\u00eancia difusa \u00e9 apenas um dos muitos recursos que voc\u00ea deve aproveitar ao implementar uma pesquisa relevante e f\u00e1cil de usar. Vamos discutir alguns deles durante esta s\u00e9rie: N-Gramas, Stopwords, Steeming, Shingle, Elision. Etc.<\/p>\n<p>Confira tamb\u00e9m o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/why-you-should-avoid-like-deep-dive-on-fts-part-1\/\">Parte 1<\/a> e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/how-analyzers-tokenizers-filters-work-fts-part-2\/\">Parte 2<\/a> desta s\u00e9rie.<\/p>\n<p>Enquanto isso, se voc\u00ea tiver alguma d\u00favida, envie-me um tweet para <a href=\"https:\/\/twitter.com\/deniswsrosa\">@deniswsrosa<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Have you sound yourself asking the question, \u201cWhat is fuzzy matching?\u201d Fuzzy matching allows you to identify non-exact matches of your target item. It is the foundation stone of many search engine frameworks and one of the main reasons why [&hellip;]<\/p>","protected":false},"author":8754,"featured_media":9920,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2165,1818],"tags":[],"ppma_author":[9059],"class_list":["post-5866","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-full-text-search","category-java"],"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>What is Fuzzy Matching? String-Searching Algorithms + Example<\/title>\n<meta name=\"description\" content=\"What is fuzzy matching? Learn different string-searching algorithms you can use and examples of how to overcome major side effect without losing relevance.\" \/>\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\/fuzzy-matching\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Is Fuzzy Matching and How to Use It Correctly\" \/>\n<meta property=\"og:description\" content=\"What is fuzzy matching? Learn different string-searching algorithms you can use and examples of how to overcome major side effect without losing relevance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/fuzzy-matching\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-09T07:44:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-07T17:46:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/fuzzy-matching-blogbanner.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1575\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@deniswsrosa\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\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\/fuzzy-matching\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/\"},\"author\":{\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\"},\"headline\":\"What Is Fuzzy Matching and How to Use It Correctly\",\"datePublished\":\"2018-10-09T07:44:26+00:00\",\"dateModified\":\"2023-02-07T17:46:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/\"},\"wordCount\":1022,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg\",\"articleSection\":[\"Full-Text Search\",\"Java\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/\",\"name\":\"What is Fuzzy Matching? String-Searching Algorithms + Example\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg\",\"datePublished\":\"2018-10-09T07:44:26+00:00\",\"dateModified\":\"2023-02-07T17:46:10+00:00\",\"description\":\"What is fuzzy matching? Learn different string-searching algorithms you can use and examples of how to overcome major side effect without losing relevance.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg\",\"width\":1575,\"height\":628,\"caption\":\"A developer making use of a fuzzy search algorithm.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What Is Fuzzy Matching and How to Use It Correctly\"}]},{\"@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\/fe3c5273e805e72a5294611a48f62257\",\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"caption\":\"Denis Rosa, Developer Advocate, Couchbase\"},\"description\":\"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.\",\"sameAs\":[\"https:\/\/x.com\/deniswsrosa\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/denis-rosa\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"What is Fuzzy Matching? String-Searching Algorithms + Example","description":"O que \u00e9 correspond\u00eancia difusa? Conhe\u00e7a diferentes algoritmos de pesquisa de cadeias de caracteres que voc\u00ea pode usar e exemplos de como superar os principais efeitos colaterais sem perder a relev\u00e2ncia.","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\/fuzzy-matching\/","og_locale":"pt_BR","og_type":"article","og_title":"What Is Fuzzy Matching and How to Use It Correctly","og_description":"What is fuzzy matching? Learn different string-searching algorithms you can use and examples of how to overcome major side effect without losing relevance.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/fuzzy-matching\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-10-09T07:44:26+00:00","article_modified_time":"2023-02-07T17:46:10+00:00","og_image":[{"width":1575,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/fuzzy-matching-blogbanner.jpg","type":"image\/jpeg"}],"author":"Denis Rosa, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@deniswsrosa","twitter_misc":{"Written by":"Denis Rosa, Developer Advocate, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/"},"author":{"name":"Denis Rosa, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257"},"headline":"What Is Fuzzy Matching and How to Use It Correctly","datePublished":"2018-10-09T07:44:26+00:00","dateModified":"2023-02-07T17:46:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/"},"wordCount":1022,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg","articleSection":["Full-Text Search","Java"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/","url":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/","name":"What is Fuzzy Matching? String-Searching Algorithms + Example","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg","datePublished":"2018-10-09T07:44:26+00:00","dateModified":"2023-02-07T17:46:10+00:00","description":"O que \u00e9 correspond\u00eancia difusa? Conhe\u00e7a diferentes algoritmos de pesquisa de cadeias de caracteres que voc\u00ea pode usar e exemplos de como superar os principais efeitos colaterais sem perder a relev\u00e2ncia.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/fuzzy-matching-blogbanner.jpg","width":1575,"height":628,"caption":"A developer making use of a fuzzy search algorithm."},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/fuzzy-matching\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"What Is Fuzzy Matching and How to Use It Correctly"}]},{"@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\/fe3c5273e805e72a5294611a48f62257","name":"Denis Rosa, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6","url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","caption":"Denis Rosa, Developer Advocate, Couchbase"},"description":"Denis Rosa \u00e9 um Developer Advocate do Couchbase e mora em Munique, na Alemanha. Ele tem uma s\u00f3lida experi\u00eancia como engenheiro de software e fala fluentemente Java, Python, Scala e Javascript. Denis gosta de escrever sobre pesquisa, Big Data, IA, microsservi\u00e7os e tudo o mais que possa ajudar os desenvolvedores a criar um aplicativo bonito, mais r\u00e1pido, est\u00e1vel e escal\u00e1vel.","sameAs":["https:\/\/x.com\/deniswsrosa"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/denis-rosa\/"}]}},"authors":[{"term_id":9059,"user_id":8754,"is_guest":0,"slug":"denis-rosa","display_name":"Denis Rosa, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","author_category":"","last_name":"Rosa, Developer Advocate, Couchbase","first_name":"Denis","job_title":"","user_url":"","description":"Denis Rosa \u00e9 um Developer Advocate do Couchbase e mora em Munique, na Alemanha. Ele tem uma s\u00f3lida experi\u00eancia como engenheiro de software e fala fluentemente Java, Python, Scala e Javascript. Denis gosta de escrever sobre pesquisa, Big Data, IA, microsservi\u00e7os e tudo o mais que possa ajudar os desenvolvedores a criar um aplicativo bonito, mais r\u00e1pido, est\u00e1vel e escal\u00e1vel."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5866","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\/8754"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=5866"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5866\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/9920"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=5866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=5866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=5866"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=5866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}