Isso é inevitável: Se estiver trabalhando com um banco de dados de documentos, você precisará pesquisar seus documentos JSON (e por meio deles).
Neste tutorial, você adicionará os recursos de pesquisa de texto completo do Couchbase à API REST básica criada com o Express que criamos ao longo desta série sobre Node.js.
A postagem anterior desta série usou o Express para criar uma API básica para criar consultas N1QL.
A postagem de hoje leva você um passo adiante. Você aprenderá a encontrar documentos JSON que contenham o texto que você está procurando, adicionando funcionalidade ao seu aplicativo que usa a função Couchbase API de pesquisa. Vamos começar.
O que é pesquisa de texto completo?
Pesquisa de texto completo (FTS) é um nome estranho, mas é um conceito bem desenvolvido em áreas acadêmicas focadas na análise de grandes partes de conteúdo de texto. No domínio do banco de dados, nós a chamamos apenas de "pesquisa", e ela se concentra em encontrar texto em documentos JSON.
Os desenvolvedores de aplicativos usam ferramentas relacionadas à pesquisa para encontrar correspondências sem precisar escrever consultas SQL que, em geral, exigem que você saiba como/onde encontrar os dados de interesse. Em um cenário de pesquisa de texto completo, você procura o texto com mais sofisticação.
Por exemplo, os sistemas de pesquisa entendem as palavras-raiz usando um conceito conhecido como stemming, para que você não precise procurar manualmente muitas permutações de um termo. Da mesma forma, curingas, prefixos e correspondência difusa são possíveis com sistemas de pesquisa robustos.
Configuração de índices de pesquisa
Há duas etapas para usar um sistema de busca: (1) indexar/analisar o texto em cada documento e (2) solicitar uma lista de documentos que contenham correspondências baseadas em texto.
O estágio de indexação é semelhante à criação de índices secundários para dados relacionais/tabulares, em que você descreve os campos ou elementos a serem indexados e o sistema os controla para você. Você também pode simplesmente dizer ao sistema para indexar cada campo de texto no documento, embora isso possa não ser eficiente na produção de grandes conjuntos de dados.
O estágio de consulta (também conhecido como busca) envia um trecho de texto para o servidor para que ele o procure. O sistema compara esse texto com os índices e retorna uma lista de documentos com correspondências.
A pesquisa de texto completo é simples, mas há um conjunto infinito de opções e perguntas a serem consideradas, como:
-
- Como lidar com frases e números
- Identificação do local em um documento onde existe um texto específico
- Análise de texto em vários idiomas
Na verdade, esse é um tópico de aprofundamento próprio. Os padrões simples usados nesta postagem podem ser expandidos para todos os cenários de pesquisa diferentes, conforme descrito em esta introdução à pesquisa de texto completo.
Preparando sua instância do Couchbase
Se você for novo nesta série de tutoriais de codificação JavaScript, precisará instalar o amostra de viagem
conforme descrito no Documentação do Couchbase.
O script usado na postagem anterior desta série também será usado como ponto de partida para a postagem de hoje. O código Node.js está incluído em o final dessa postagem.
À medida que avança nestes tutoriais do Node.j, você está criando um aplicativo de API REST mais complexo e útil. Vamos nos aprofundar na criação do índice de pesquisa necessário para dar suporte à próxima etapa de seu projeto.
Criar um índice de pesquisa de texto básico
Para criar um índice de pesquisa, você seleciona a opção Pesquisa
na guia Console da Web do Couchbase e pressione o botão Adicionar índice
botão.
Em seguida, digite o nome que deseja dar ao índice e escolha o Bucket a ser analisado (amostra de viagem
). Termine pressionando o botão Criar índice
para enviar suas escolhas. Há muitas opções diferentes para escolher, mas, no exemplo de hoje, manteremos todos os padrões para simplificar. A animação a seguir mostra cada uma dessas etapas:
Depois de concluir essas etapas, você deverá ver os índices de pesquisa e o status deles no Console da Web. Você também poderá ver quantos documentos foram processados.
Indexação no amostra de viagem
O Data Bucket leva alguns minutos, mas, depois de concluído, você pode fazer uma solicitação de pesquisa de amostra por meio da interface de usuário básica da Web, conforme mostrado abaixo.
Você insere um termo simples na caixa de pesquisa e uma lista de IDs de documentos correspondentes é retornada com as correspondências de maior classificação na parte superior. O Console da Web facilita o clique nessas IDs para ver o texto completo do documento.
Criação de uma função de pesquisa de texto simples
Há muitas opções adicionais para ajustar suas pesquisas com operações booleanas, correspondência difusa e muito mais. O Console da Web faz apenas uma simples string de consulta
e esse é o mesmo tipo que você implementará em seu código.
Para criar a nova função de pesquisa de texto completo, você precisa:
- Forneça uma cadeia de caracteres para pesquisar (por exemplo, "grand").
- Especifique o índice de pesquisa a ser usado:
pesquisa de viagens
. - Declara o tipo de consulta a ser usado:
queryString
. - Monte todas as peças e envie para o servidor.
- Receber resultados e exibi-los ao usuário/aplicativo.
Estas cinco linhas de código JavaScript abaixo são um exemplo de configuração dessas variáveis, agrupando-as, passando-as para o cluster e imprimindo os resultados no console:
1 2 3 4 5 |
const querystr = "grandioso"; const searchIndex = 'travelsearch'; const stringQuery = couchbase.Pesquisa.queryString(querystr); const searchResult = agrupamento.pesquisa(searchIndex, stringQuery); console.registro(searchResult); |
Se você quiser ajustar o tipo de consulta de pesquisa, troque queryString
na terceira linha com outro método. Exemplos de código de diferentes tipos são fornecidos na seção Documentação do Couchbase Full-Text Search.
Por exemplo, uma consulta de intervalo de datas tem a seguinte aparência:
const dateQuery = couchbase.SearchQuery.dateRange().start(startDate).end(endDate)
Abaixo está um exemplo completo de script autônomo que inclui a lógica básica. Nós o incorporamos ao exemplo da API Express REST na próxima seção.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
var couchbase = exigir("couchbase"); assíncrono função principal(){ var agrupamento = novo couchbase.Aglomerado("couchbase://localhost", { nome de usuário: "Administrador", senha: "Administrador" }); var balde = agrupamento.balde("amostra de viagem"); var coleção = balde.defaultCollection(); const querystr = "grandioso"; const searchIndex = 'travelsearch'; const stringQuery = couchbase.Pesquisa.queryString(querystr); const searchResult = aguardar agrupamento.pesquisa(searchIndex, stringQuery); console.registro(searchResult); se (searchResult.meta.status.falhou == 0) { searchResult.linhas.forEach((fila)=>{ console.registro(fila); }); } } principal(); |
Levando o código adiante
Continuando nosso exemplo, agora você pode adicioná-lo ao código da API REST que criamos em Tutorial da semana passada.
Adicione o código junto com o novo roteamento Express para que você possa enviar uma solicitação de pesquisa de um URL no navegador. Nesse caso, o caminho será: /search/[termo de pesquisa]
- Por exemplo, /search/grand
.
Aqui está a definição de rota para criar a consulta de pesquisa de texto completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
aplicativo.obter('/search/:searchterm', runAsync(assíncrono (req, res) => { const querystr = req.parâmetros.termo de pesquisa; const searchIndex = 'travelsearch'; const stringQuery = couchbase.Pesquisa.queryString(querystr); const searchResult = aguardar agrupamento.pesquisa( searchIndex, stringQuery, // adicionar opções em seu próprio objeto: { tempo limite:2000, limite:5} ).captura((e)=>{console.registro(e); lançar e;}); se (searchResult.meta.status.falhou == 0) { res.json(searchResult); searchResult.linhas.forEach((fila)=>{ console.registro(fila); }) } })) |
Clique abaixo para ver o código completo da API REST em funcionamento, incluindo a busca de documentos, a consulta N1QL e as rotas de pesquisa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
var aplicativo = exigir("expresso)(); var couchbase = exigir("couchbase"); assíncrono função principal() { aplicativo.obter('/get/:docid', runAsync(assíncrono (req, res) => { var docid = req.parâmetros.docid; var docjson = aguardar getDoc(docid, função(erro, resultado){ res.json(resultado.conteúdo) }); res.json(docjson.conteúdo); })); aplicativo.obter('/query/:cityname', runAsync(assíncrono (req, res) => { var nome da cidade = req.parâmetros.nome da cidade; var querystr = `SELECT type, name, city FROM `viagens-amostra` WHERE city = $CITY;` var parâmetros = { parâmetros: { CIDADE: nome da cidade}} aguardar agrupamento.consulta(querystr, parâmetros, função(erro, resultado){ res.json(resultado) }) })); aplicativo.obter('/search/:searchterm', runAsync(assíncrono (req, res) => { const querystr = req.parâmetros.termo de pesquisa; const searchIndex = 'travelsearch'; const stringQuery = couchbase.Pesquisa.queryString(querystr); const searchResult = aguardar agrupamento.pesquisa( searchIndex, stringQuery, // adicionar opções em seu próprio objeto: {tempo limite:2000, limite:5} ).captura((e)=>{console.registro(e); lançar e;}); se (searchResult.meta.status.falhou == 0) { res.json(searchResult); searchResult.linhas.forEach((fila)=>{ console.registro(fila); }) } })) aplicativo.ouvir(3000, () => console.registro('Listening on port 3000' (Escutando na porta 3000))); função runAsync (retorno de chamada) { retorno função (req, res, próxima) { retorno de chamada(req, res, próxima) .captura(próxima) } } var agrupamento = novo couchbase.Aglomerado("couchbase://localhost", { nome de usuário: "Administrador", senha: "Administrador" }); var balde = agrupamento.balde("amostra de viagem"); var coleção = balde.defaultCollection(); var getDoc = assíncrono (chave) => { var resultado = aguardar coleção.obter(chave); console.registro(resultado) retorno resultado } } principal(); |
Execução da API REST de consulta de pesquisa
Acesse o aplicativo por meio do navegador da Web na porta 3000 e com o caminho de pesquisa: http://localhost:3000/search/grand
.
Os resultados da pesquisa são mostrados aqui e incluem uma lista de IDs de documentos correspondentes e a pontuação de classificação da correspondência:
1 2 3 4 5 6 7 8 9 10 |
{"rows" (linhas):[{"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"landmark_21813","pontuação":1.063667683545401,"sort":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"airport_7057","pontuação":1.016530994468649,"sort":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"airport_4063","pontuação":1.0098211451111556,"sort":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"airport_3442","pontuação":1.0098211451111556,"sort":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"airport_6448","pontuação":1.0032424768865669,"sort":["_score"]}], "meta":{"status":{"total":1,"falhou":0,"bem-sucedido":1},"request" (solicitação):{"query" (consulta):{"query" (consulta):"grandioso"},"tamanho":5,"de":0,"destaque":nulo, "campos":nulo,"facetas":nulo,"explicar":falso, "sort":["-_score"],"includeLocations":falso, "search_after":nulo,"search_before":nulo}, "hits":[],"total_hits":169,"max_score":1.063667683545401,"pegou":208427,"facetas":nulo}} |
Observe que os resultados da pesquisa também incluem alguns metadados úteis que mostram o número total de ocorrências/combinações, o tempo de execução e muito mais.
Conclusão
As oportunidades de uso do Couchbase em aplicativos baseados em pesquisa são infinitas.
Com todos os diferentes tipos de consultas e outras opções de pesquisa disponíveis, ainda há muito mais a aprender. Aqui estão alguns pontos de partida para você considerar:
-
- Leia os documentos e substitua por outro tipo de consulta de pesquisa.
- Complete o Curso de certificação em Node.js e Couchbase.
- Pegue o Curso de certificação de arquiteto on-line gratuito que abrange a pesquisa de texto completo e muito mais
Este é o resumo desta série sobre desenvolvimento com o Node.js e o Couchbase. Boa sorte em sua jornada contínua com o JavaScript!
Fique por dentro do restante da série de instruções sobre Node.js + Couchbase:
-
- Como começar a usar o SDK do Node.js para o Couchbase
- Como criar chamadas Get/Upsert assíncronas com o Node.js e o Couchbase
- Crie um aplicativo baseado em REST com Node.js, Express e Couchbase
- Como consultar dados JSON usando N1QL para Node.js e Couchbase
- Como adicionar a funcionalidade de pesquisa de texto completo ao seu aplicativo JavaScript
Faça o download do Couchbase 7 hoje mesmo