我打算建立此倉庫的目的是分享我對此主題的簡短知識:全文搜索或僅僅是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的簡短文檔。