Mon intention de construire ce dépôt était de partager mes brèves connaissances sur ce sujet: la recherche en texte intégral, ou tout simplement FTS . Comme vous le verrez, j'ai fait des tests et des recherches pour parvenir à cette conclusion, certains liens dans la dernière section pourraient aider quiconque veut comprendre ce que j'ai lu et (pourquoi pas?) Même aider et apporter des contributions à ce référentiel (les relations publiques sont appréciées).
Ce référentiel contient une API Rails 6.x qui utilise le GEM SearchKick pour produire de grandes recommandations (par FTS) en fonction de l'entrée de l'utilisateur. Il s'agit d'une simple API HTTP simple qui vous permet de créer des articles avec des champs de titre et de corps (comme vous le verrez plus tard) et de faire des recherches qui approchent de vraies bonnes recommandations, non seulement simples la comparaison des chaînes. À cette fin, je commencerai à enquêter s'il existe d'autres solutions à l'approche FTS en plus d'Elasticsearch.
Un simple "Google" peut vous apporter plusieurs façons d'effectuer des FT dans des SGBD plus courants comme MySQL ou PostgreSQL. Il est presque toujours préférable de choisir une alternative plus testée et répandue contre une "nouvelle" - même Elasticsearch n'est pas si jeune - une technologie concernant la fiabilité de la communauté et des logiciels. Alors pourquoi ne pas choisir l'ancien Bullet d'argent entre PostgreSQL et MySQL?
Il y a quelques façons dont nous pouvons avoir des FT dans MySQL: recherche de langue naturelle et recherche booléenne. La recherche de langue est plus claire pour notre compréhension car elle recherche simplement un mot par mot en comparant la requête aux champs que vous spécifiez. Les lignes qui ont plus de correspondances avec votre chaîne de requête marqueront plus et seront classées par ce score. Le score zéro signifie aucune correspondance et que les lignes ne sont pas renvoyées dans MySQL FTS. Vérifiez cet exemple ( parties obscurcies qui pourraient être sensibles ):
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;Dans l' approche booléenne, vous pouvez utiliser d'autres outils qui peuvent modifier le "score" pour chaque mot individuellement. En utilisant le mode de langue naturelle, vous pourriez trouver de bonnes correspondances et il est facile à implémenter, principalement si nous nous comparons au mode booléen. Mais cela ne couvre pas les cas d'utilisation lorsque l'utilisateur tape de manière incorrecte l'entrée. Il attend donc de l'utilisateur très précis d'écriture - et ce n'est jamais la vérité. Le même cas pour PostgreSQL: il existe certaines façons de faire des FT, mais. Ici, nous avons un problème que nous ne pouvons résoudre qu'en analysant la chaîne plus profonde . Regardez quand nous changeons simplement 'lei' en 'le' (supprimer 'i'), cela arrive à notre score:
Afin de résoudre ce problème, ElasticSearches a mis en œuvre son FTS avec Java Lucene Engine. Cela nous apporte un tas d'outils comme l'interprétation des fautes d'orthographe, les personnages entièrement spéciaux - Como acentos na Minha língua pátria! - et autres. Toutes ces choses peuvent être vraiment complexes à développer par la nôtre, donc il est extrêmement justifiable d'utiliser Elasticsearch si vous cherchez ces outils.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installIl est très facile d'exécuter des conteneurs de ces dépendances de service Rails - PostgreSQL et Elasticsearch - au lieu de l'installer dans votre machine. Cela pourrait vous aider à mieux gérer les processus et l'administration de la mémoire et du stockage. Alors ici, vous avez un extrait pour faire exactement cela:
$ 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.2Si vous êtes nouveau sur Docker et que vous avez uniquement des images en cours d'exécution, vous pouvez le désactiver en exécutant uniquement:
$ sudo docker stop $( sudo docker ps -a -q )Et revire avec:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sIci, vous pouvez obtenir une brève documentation sur Postman sur la recherche et la création de l'API.