Minha intenção de construir esse repositório era compartilhar meu breve conhecimento sobre esse assunto: pesquisa de texto completo ou apenas fts . Como você verá, fiz alguns testes e pesquisas para chegar a essa conclusão, alguns links na última seção podem ajudar quem quiser entender o que eu li e (por que não?) Jesus ajudar e fazer algumas contribuições para esse mesmo repositório (os PRs são apreciados).
Este repositório contém uma API Rails 6.x que usa a GEM de Searchkick para produzir ótimas recomendações (por FTS) com base na entrada do usuário. É uma pequena API HTTP simples que permite criar postagens com campos de título e corpo (como você verá mais adiante) e faça pesquisas que abordagens para boas recomendações reais, não apenas a comparação de strings. Para esse fim, começarei a investigar se houver outras soluções para a abordagem do FTS além do Elasticsearch.
Um "Google" simples pode trazer a você várias maneiras de realizar SFTs em DBMs mais comuns, como MySQL ou PostgreSQL. É quase sempre melhor escolher uma alternativa mais testada e espalhada contra uma "nova" - mesmo o Elasticsearch não é tão jovem - a tecnologia relativa à confiabilidade da comunidade e do software. Então, por que não escolher o antigo bullet de prata entre o PostgreSQL e o MySQL?
Existem algumas maneiras de ter FTS no MySQL: pesquisa de linguagem natural e pesquisa booleana. A pesquisa de idiomas é mais clara para a nossa compreensão, porque está simplesmente pesquisando palavra por palavra comparando a consulta com os campos que você especificar. As linhas que têm mais correspondências com sua sequência de consulta terão mais pontuação e serão classificadas por essa pontuação. A pontuação zero significa nenhuma correspondência e que as linhas não são devolvidas no MySQL FTS. Verifique este exemplo ( peças ofuscadas que podem ser sensíveis ):
SELECT CASE WHEN LENGTH(content) > 140
THEN CONCAT( SUBSTRING (content, 1 , 140 ), ' ... ' )
ELSE content
END AS adapted_content,
MATCH(content) AGAINST ( ' lei ' IN NATURAL LANGUAGE MODE) AS score
FROM posts;Na abordagem booleana, você pode usar outras ferramentas que podem alterar a "pontuação" para cada palavra individualmente. Usando o modo de linguagem natural, você pode encontrar algumas boas correspondências e é fácil de implementar, principalmente se compararmos ao modo booleano. Mas isso não cobre casos de uso quando o usuário digita a entrada incorretamente. Por isso, espera da ótima maneira precisa de escrever - e essa nunca é a verdade. O mesmo caso de PostgreSQL: existem algumas maneiras pelas quais você pode fazer FTS, mas. Aqui temos um problema que podemos resolver apenas analisando a string mais profunda . Olhe quando apenas mudamos de 'lei' para 'le' (remover 'i'), isso acontece com a nossa pontuação:
Para resolver esse problema, o Elasticsearches implementou seu FTS com o Java Lucene Engine. Isso nos traz um monte de ferramentas, como interpretação de erros de ortografia, caráters suming e especiais - como Acentos na Mabe Língua Pátria! - e outros. Todas essas coisas podem ser realmente complexas de se desenvolver por nossa, por isso é extremamente justificável usar o Elasticsearch se você buscar essas ferramentas.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installÉ muito fácil executar contêineres dessas dependências do serviço Rails - PostGresql e Elasticsearch - em vez de instalá -lo em sua máquina. Pode ajudá -lo a lidar melhor com os processos e a administração de memória e armazenamento. Então aqui você tem um trecho para fazer exatamente isso:
$ docker run --name postgres-database -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $HOME /docker/volumes/postgres:/var/lib/postgresql/data postgres
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -d -e " discovery.type=single-node " docker.elastic.co/elasticsearch/elasticsearch:7.6.2Se você é novo no Docker e tem apenas isso nas imagens em execução, poderá desativá -lo apenas executando:
$ sudo docker stop $( sudo docker ps -a -q )E ligue novamente com:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sAqui você pode obter uma breve documentação sobre o Postman sobre a pesquisa e a criação da API.