Pesquisa de texto completo (ou FTS) é um novo recurso que está sendo lançado como uma prévia para desenvolvedores no Couchbase 4.5. Ele não se destina à produção e ainda não é compatível, mas é um vislumbre do que está por vir.
Ao oferecer a capacidade de pesquisa, um simples LIKE '%foo%'
com N1QL não é suficiente. Seus usuários esperam uma experiência de pesquisa mais rica: uma experiência que reconheça o idioma e classifique os resultados de acordo com sua relevância.
Nesta postagem do blog, vou mostrar a você:
- Como configurar um índice de pesquisa de texto completo
- Como executar uma consulta de pesquisa de texto completo no Console do Couchbase
- Como executar uma consulta de pesquisa de texto completo com destaque no ASP.NET
Configurar um índice de pesquisa de texto completo
Primeiro, você precisa ter certeza de que está usando Couchbase 4.5 (beta, pelo menos)Verifique se você tem acesso ao Console do Couchbase e se o seu cluster está executando um serviço de texto completo. Você pode verificar se há um serviço Full Text em execução clicando em "Server Nodes" (Nós do servidor) no Console do Couchbase. Os serviços (como o Full Text) precisam ser ativados/desativados ao adicionar um nó ao cluster. Se precisar de uma atualização, dê uma olhada no meu postagem do blog sobre como instalar e configurar o Couchbase no Windows.
Vou configurar um índice de pesquisa de texto completo no
bucket de dados de amostra. Você pode instalá-lo acessando Settings -> Sample Buckets, selecionando 'travel-sample' e clicando em "Create".amostra de viagem
Nesses dados de amostra, há documentos do tipo "landmark". Entre outras coisas, esses documentos contêm campos de "conteúdo". Aqui está um trecho de um dos documentos de referência. (ID 'landmark_16079' se estiver acompanhando):
1 2 3 4 5 6 7 |
{ "título": "Londres/Cidade de Londres", "name" (nome): "20 Fenchurch Street", "content" (conteúdo): "O incomum"walkie-talkie talkie" O perfil desse arranha-céu em construção de Rafael Vinoly o levou às manchetes.", "tipo": "marco" } |
Com essa estrutura em mente, vamos criar o índice. Vá para Indexes->Full Text (Índices->Texto completo) e clique em "New Full Text Index" (Novo índice de texto completo).
Vou nomear o índice amostra de viagem-idx
e colocá-lo no amostra de viagem
balde. Há muitas opções aqui, mas vou abordar apenas os mapeamentos de tipos. Expanda "Type Mappings" (Mapeamentos de tipos) e clique em "Add Type Mapping" (Adicionar mapeamento de tipos). Isso permite que você restrinja a pesquisa de texto completo a documentos de um determinado tipo (neste caso, "landmark", que corresponde ao campo "type"). Marque também a caixa "only index specified fields" (indexar somente os campos especificados); caso contrário, todos os campos dos documentos serão indexados para pesquisa. Pressione "ok".
Em seguida, passe o mouse sobre o mapeamento do tipo 'landmark' e clique no ícone +
e clique em "inserir campo filho". Se você quiser indexar dados de pesquisa que estejam mais abaixo na hierarquia do documento, precisará "inserir mapeamento filho" (quantos níveis forem necessários) até chegar a eles. No nosso caso, o campo de conteúdo está no nível da raiz, portanto, não preciso fazer isso.
Para o campo filho, digite o nome do campo ("content") no campo, deixe todo o resto como está, marque a caixa de seleção "store" (mais sobre isso adiante) e clique em "ok".
Por fim, edite o mapeamento do tipo "default" e desmarque a opção "enabled". Esse mapeamento permitiria a pesquisa em todos os documentos, mas, neste exemplo, queremos limitar apenas ao marco. Pressione "ok" e "Create Index".
Depois de clicar em "Create Index", você verá uma visão geral do índice que acabou de criar. Ele começará imediatamente a indexar os documentos. Se você clicar no ícone Atualizar
você verá a contagem dos documentos que foram indexados até o momento.
Ele será 100% quando estiver concluído.
Executar uma consulta de pesquisa de texto completo no Console do Couchbase
Antes de entrarmos no C#/.NET, você pode experimentar a pesquisa de texto completo diretamente no console. Vá para Indexes->Full Text (Índices->Texto completo) e selecione o índice de texto completo que você acabou de criar. Digite um termo de pesquisa (se estiver usando a amostra de viagem, "inn" (pousada), "skyscraper" (arranha-céu) ou "bed and breakfast" (cama e café da manhã) são bons termos para tentar).
Ao clicar em pesquisar, você receberá uma página de resultados de pesquisa (ID do documento e um fragmento de conteúdo) em ordem de pontuação de relevância. Observe que os termos de pesquisa são destacados no fragmento de conteúdo. A ativação de "store" no campo filho faz com que isso funcione. Se você não ativar o armazenamento, ainda obterá os resultados do documento em ordem de relevância, mas não obterá o fragmento de conteúdo destacado.
Observe que a pesquisa de texto completo usa Blevee permite que você faça pesquisas mais complexas (frases exatas, consultas booleanas, etc.). Tente pesquisar "cama e café da manhã"
ou café da manhã
por exemplo, e veja o que acontece.
Consulta de pesquisa de texto completo com destaque no ASP.NET
Quando estiver satisfeito com o índice de pesquisa de texto completo que você criou, é hora de tirá-lo do Console do Couchbase e colocá-lo em um aplicativo real. Criei um exemplo em ASP.NET que demonstra como usar o SDK do Couchbase .NET para executar uma pesquisa de texto completo. Para este exemplo, presumo que você esteja familiarizado com o ASP.NET MVC e com os princípios básicos da integração do ASP.NET com o Couchbase. Se esse não for o caso, recomendo que você leia o artigo Exemplo do ASP.NET "Hello World" sobre o qual escrevi no blog anteriormente.
Criei duas ações: Index e Search. A ação Index mostra uma exibição que permite que um usuário digite uma string de pesquisa. Aqui estão o controlador e a ação:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público classe HomeController : Controlador { privado somente leitura IBucket _bucket; público HomeController(IBucket balde) { _bucket = balde; } público ViewResult Índice() { retorno Ver(); } } |
E aqui está a exibição em Index.cshtml:
1 2 3 4 5 6 7 8 |
<h1>Pesquisa</h1> @usando (Html.BeginForm("Pesquisar", "Casa")) { @Html.Caixa de texto("q","") } |
Não é bonito, mas é funcional. Em seguida, criei uma ação Search. Essa ação receberá a consulta de pesquisa e produzirá os resultados do Couchbase. Os resultados serão muito parecidos com o que vimos no Console do Couchbase: ID do documento, pontuação de relevância e fragmentos destacados.
Há três etapas para a execução de uma pesquisa de texto completo:
- Instanciar algum objeto que implemente
ISearchQuery
. Há muitas opções; estou usandoMatchQuery
para este exemplo. - Instanciar um objeto SearchParams para especificar as opções de pesquisa.
- Use um
IBucket
para executar a consulta + parâmetros e obter resultados.
Neste exemplo, realizei todas as três etapas diretamente na ação Search:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
público Resultado da ação Pesquisa(string q) { se (string.IsNullOrEmpty(q)) retorno Ver("Índice"); var consulta = novo MatchQuery(q); var searchParams = novo SearchParams() .Limite(10) .Tempo limite(Tempo.FromMilliseconds(10000)) .Destaque(HighLightStyle.Html); var resultados = _bucket.Consulta("travel-sample-idx", consulta, searchParams); var searchResultsModel = novo SearchResultsModel(q, resultados); retorno Ver(searchResultsModel); } |
Algumas observações sobre o SearchParams:
- Estou limitando-o aos 10 primeiros. Há também um método Skip() que você pode usar para paginação.
- Estou definindo um tempo limite de 10000ms. Se eu criar o índice corretamente, os resultados serão retornados muito rapidamente, mas se eu mexer no índice e algo der errado, quero que a pesquisa falhe rapidamente.
- Estou definindo o estilo de destaque como HTML. Isso colocará o
ao redor dos termos de pesquisa destacados nos resultados do fragmento.
Também criei um SearchResultsModel
modelo de visualização. Isso faz o mapeamento de que preciso para obter o ID do documento, a pontuação e os fragmentos dos resultados da pesquisa (bem como as palavras-chave que o usuário digitou).
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 |
público classe SearchResultsModel { público Lista Resultados { obter; privado definir; } público string Palavras-chave { obter; privado definir; } público SearchResultsModel(string palavras-chave, ISearchQueryResult resultados = nulo) { Palavras-chave = palavras-chave; Resultados = resultados == nulo ? novo Lista() : resultados.Acertos.Selecione(r => novo SearchResultModel(r)).ToList(); } } público classe SearchResultModel { público string DocumentId { obter; privado definir; } público duplo Pontuação { obter; privado definir; } público Lista Fragmentos { obter; definir; } público SearchResultModel(ISearchQueryRow searchQueryRow) { DocumentId = searchQueryRow.Id; Pontuação = searchQueryRow.Pontuação; Fragmentos = searchQueryRow.Fragmentos.SelectMany(f => f.Valor).ToList(); } } |
Por fim, aqui está a visualização Search.cshtml:
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 |
@modelo FullTextSearchExample.Modelos.SearchResultsModel <h1>Pesquisa</h1> @usando (Html.BeginForm("Pesquisar", "Casa")) { @Html.Caixa de texto("q", Modelo.Palavras-chave) } @se (!Modelo.Resultados.Qualquer()) { Não resultados encontrado } mais { antes de (var resultado em Modelo.Resultados) { <h2>Documento: @resultado.DocumentId</h2> <h3>Pontuação: @resultado.Pontuação</h3> antes de (var fragmento em resultado.Fragmentos) { @Html.Bruto(fragmento) } } } |
Não é uma página HTML muito bonita, mas é funcional. Veja como ela se parece em ação:
Conclusão
Lembre-se de que esse recurso é apenas uma prévia para desenvolvedores: ainda não há suporte para ele e ainda não é recomendado para produção. Mas a pesquisa de texto completo está chegando ao Couchbase. Na verdade, você pode opinar sobre como o recurso será implementado. Dê uma olhada no Pesquisa de texto completo RFC no GitHubE fique à vontade para fazer perguntas ou deixar comentários.
Ainda tem dúvidas? Precisa de ajuda com alguma coisa? Deixe um comentário, me envie uma mensagem no Twitterou envie um e-mail para mim (matthew.groves AT couchbase DOT com).