我打算建立此仓库的目的是分享我对此主题的简短知识:全文搜索或仅仅是fts 。如您所见,我已经做了一些测试和研究来得出这一结论,最后一部分中的一些链接可以帮助任何想了解我阅读的内容的人(为什么不呢?
该存储库包含一个Rails 6.X API,该API使用搜索kick宝石根据用户的输入生成了出色的建议(通过FTS)。这是一个简单的小型HTTP API,可让您可以创建带有标题和身体字段的帖子(如您稍后会看到的),并进行搜索以获取真正的好建议,而不仅仅是Simples String比较。为此,除了Elasticsearch以外,我还将开始研究FTS方法的其他解决方案。
一个简单的“谷歌搜索”可以为您带来多种在MySQL或PostgreSQL等更常见的DBM中执行FTS的方法。选择一个更经过测试和传播的替代方案几乎总是更好,即使不是那么年轻- 与社区和软件可靠性有关的技术。那么,为什么不选择PostgreSQL和MySQL之间的旧银呢?
我们可以通过几种方式在MySQL中获得FTS:自然语言搜索和布尔搜索。对于我们的理解,语言搜索更清楚,因为它只是在逐字搜索将查询与您指定的字段进行比较。与您的查询字符串具有更多对应关系的行将得分更高,并按照这个得分进行排名。零分数意味着没有信件,并且在mysql fts中不会返回行。检查此示例(混淆可能敏感的零件):
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;在布尔方法中,您可以使用一些可以单独更改每个单词的“得分”的工具。使用自然语言模式,您可以找到一些良好的匹配项,并且很容易实现,主要是如果我们与布尔模式进行比较。但是,当用户错误地键入输入时,这不涵盖用例。因此,它希望用户从用户出色的准确写作方式- 这绝不是事实。 PostgreSQL的情况相同:您可以通过一些方法来进行FTS,但是。在这里,我们有一个问题,只能通过更深入地分析字符串来解决。看,当我们将“ lei”更改为“ le”(删除'i')时,这发生在我们的分数中:
为了解决此问题,Elasticsearches用Java Lucene Engine实施了FTS。它为我们带来了一堆工具,例如拼写错误的解释,茎和特殊特征-como acentos na minhalínguaPátria! - 和其他。所有这些东西都可以由我们自己开发,因此,如果您寻求这些工具,则使用Elasticsearch是非常合理的。
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle install运行此导轨服务依赖项的容器很容易 - PostgreSQL和Elasticsearch-而不是将其安装在计算机中。它可以帮助您更好地处理过程,内存和存储管理。因此,在这里您有一个片段可以做到这一点:
$ 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.2如果您是Docker的新手,并且仅对正在运行的图像进行此操作,则只能执行以下操作:
$ sudo docker stop $( sudo docker ps -a -q )并再次打开:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails s在这里,您可以在API搜索和创建方面获得有关Postman的简短文档。