Meine Absicht, dieses Repo aufzubauen, war es, mein kurzes Wissen über dieses Thema zu teilen: Volltext-Suche oder nur FTS . Wie Sie sehen werden, habe ich einige Tests und Nachforschungen angenommen, um diese Schlussfolgerung zu ziehen, einige Links im letzten Abschnitt könnten jedem helfen, der verstehen möchte, was ich gelesen habe und (warum nicht?) Sogar Hilfe und einige Beiträge zu diesem Repository leisten (PRs werden geschätzt).
Dieses Repository enthält eine Rails 6.x -API, die das Searchkick -Gem verwendet, um großartige Empfehlungen (nach FTS) basierend auf der Eingabe des Benutzers zu erstellen. Es handelt sich um eine einfache winzige HTTP -API, mit der Sie Beiträge mit Titel- und Körperfeldern erstellen können (wie Sie später sehen werden) und Suchanfragen durchführen, die sich zu wirklich guten Empfehlungen nähern, nicht nur Simples -String -Vergleiche. Zu diesem Zweck werde ich anfangen zu untersuchen, ob es neben Elasticsearch andere Lösungen für den FTS -Ansatz gibt.
Ein einfaches "Googeln" kann Ihnen eine Reihe von Möglichkeiten bringen, FTs in häufigeren DBMs wie MySQL oder Postgresql durchzuführen. Es ist fast immer besser, eine getestete und verbreitete Alternative gegen ein "neues" - selbst Elasticsearch ist nicht so jung - Technologie für die Zuverlässigkeit der Community und Software aus. Warum also nicht die alte Silberkupplungen zwischen Postgresql und MySQL wählen?
Es gibt ein paar Möglichkeiten, wie wir FTS in MySQL: Natural Language Search und Boolean Search haben können. Die Sprachsuche ist für unser Verständnis klarer, da es einfach nach Word-für-Wort-Abfrage mit den von Ihnen angegebenen Feldern sucht. Die Zeilen, die mehr Korrespondenzen mit Ihrer Abfragebarstellung haben, werden mehr punkten und durch genau diese Punktzahl eingestuft. Zero Score bedeutet keine Korrespondenz und dass Zeilen in MySQL FTS nicht zurückgegeben werden. Überprüfen Sie dieses Beispiel ( verschleierte Teile, die empfindlich sein könnten ):
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;Im Booleschen Ansatz können Sie einige andere Tools verwenden, die die "Punktzahl" für jedes Wort einzeln ändern können. Mit dem natürlichen Sprachmodus können Sie einige gute Übereinstimmungen finden und es ist einfach zu implementieren, hauptsächlich, wenn wir uns mit dem Booleschen Modus vergleichen. Dies umfasst jedoch keine Anwendungsfälle, wenn der Benutzer die Eingabe falsch eingibt. Von dem Benutzer erwartet es also eine großartige genaue Art des Schreibens - und das ist niemals die Wahrheit. Das gleiche Fall für PostgreSQL: Es gibt einige Möglichkeiten, wie Sie FTS machen können, aber. Hier haben wir ein Problem, das wir nur lösen können, indem wir die Saite tiefer analysieren . Schauen Sie, wenn wir nur 'Lei' in 'Le' (entfernen Sie 'I'), das passiert mit unserer Punktzahl:
Um dieses Problem zu lösen, implementierte Elasticsearches seine FTS mit Java Lucene Engine. Es bringt uns eine Reihe von Werkzeugen wie Missspellings -Interpretation, Stamm und besonderen Charakteren - Como acentos na minha língua pátria! - und andere. All dieses Zeug kann wirklich komplex sein, um von unseren eigenen zu entwickeln. Daher ist es äußerst gerechtfertigt, Elasticsearch zu verwenden, wenn Sie nach diesen Tools suchen.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installEs ist sehr einfach, Container dieser Rails -Serviceabhängigkeiten - PostgreSQL und Elasticsearch - zu betreiben, anstatt sie in Ihrem Computer zu installieren. Es könnte Ihnen helfen, die Prozesse und Speicher- und Speicherverwaltung besser zu behandeln. Hier haben Sie also einen Ausschnitt, um genau das zu tun:
$ 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.2Wenn Sie neu in Docker sind und nur das für Bilder ausgeführt werden, können Sie es ausführen, indem Sie nur ausführen:
$ sudo docker stop $( sudo docker ps -a -q )Und schalten Sie wieder mit:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sHier erhalten Sie eine kurze Dokumentation über Postbote über die API -Suche und das Erstellen.