Mi intención de construir este repositorio era compartir mi breve conocimiento sobre este tema: búsqueda de texto completo o simplemente FTS . Como verá, hice algunas pruebas e investigaciones para llegar a esa conclusión, algunos enlaces en la última sección podrían ayudar a cualquiera que quiera entender lo que he leído y (¿por qué no?) Incluso ayudar y hacer algunas contribuciones a este mismo repositorio (las relaciones públicas son apreciadas).
Este repositorio contiene una API Rails 6.x que usa la gema SearchKick para producir excelentes recomendaciones (por FTS) basadas en la entrada del usuario. Es una pequeña API HTTP simple que le permite crear publicaciones con campos de título y corporales (como verá más adelante) y realizar búsquedas que se acercan a buenas recomendaciones, no solo la comparación de cadenas de simples. Para ese propósito, comenzaré a investigar si hay otras soluciones al enfoque FTS además de Elasticsearch.
Un simple "Google" puede traerle muchas formas de realizar FTS en DBMS más comunes como MySQL o PostgreSQL. Casi siempre es mejor elegir una alternativa más probada y difundida contra una "nueva", incluso Elasticsearch no es tan joven , la tecnología relativa a la comunidad y la confiabilidad del software. Entonces, ¿por qué no elegir la vieja caña de plata entre PostgreSQL y MySQL?
Hay un par de formas en que podemos tener FTS en MySQL: búsqueda de lenguaje natural y búsqueda booleana. La búsqueda del idioma es más clara para nuestra comprensión porque simplemente está buscando palabra por palabra comparando la consulta con los campos que especifica. Las filas que tienen más correspondencias con su cadena de consulta obtendrán más y se clasificarán por este mismo puntaje. La puntuación cero significa que no hay correspondencia y que las filas no se devuelven en MySQL FTS. Verifique este ejemplo ( partes ofuscadas que podrían ser 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;En el enfoque booleano, puede usar algunas otras herramientas que pueden cambiar la "puntuación" para cada palabra individualmente. Usando el modo de lenguaje natural, puede encontrar algunas buenas coincidencias y es fácil de implementar, principalmente si nos comparamos con el modo booleano. Pero esto no cubre los casos de uso cuando el usuario escribe la entrada incorrectamente. Por lo tanto, espera del usuario una gran forma de escritura precisa , y esta nunca es la verdad. El mismo caso para PostgreSQL: hay algunas formas en que puede hacer FTS, pero. Aquí tenemos un problema que solo podemos resolver analizando la cadena más profunda . Mire cuando simplemente cambiemos 'lei' a 'le' (elimine 'i'), que le sucede a nuestro puntaje:
Para resolver este problema, ElasticSearches implementó sus FTS con Java Lucene Engine. Nos trae un montón de herramientas como interpretación de mal ortográficos, características de Stemming y especiales: como acentos na minha língua Pátria! - y otros. Todo esto puede ser realmente complejo de desarrollar por nuestro, por lo que es un uso extremadamente justificable Elasticsearch si busca esas herramientas.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installEs muy fácil ejecutar contenedores de estas dependencias de servicio Rails (PostgreSQL y Elasticsearch, en lugar de instalarlo en su máquina. Podría ayudarlo a manejar mejor los procesos y la administración de memoria y almacenamiento. Así que aquí tienes un fragmento para hacer exactamente eso:
$ 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 eres nuevo en Docker y solo tienes esto en las imágenes en ejecución, podría desactivarlo solo ejecutando:
$ sudo docker stop $( sudo docker ps -a -q )Y enciende de nuevo con:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sAquí puede obtener una breve documentación sobre Postman a través de la búsqueda y creación de API.