Мое намерение построить это репо было поделиться своими краткими знаниями по этому вопросу: полнотекстовый поиск или просто FTS . Как вы увидите, я сделал несколько тестов и исследований, чтобы прийти к такому выводу, некоторые ссылки в последнем разделе могут помочь любому, кто хочет понять, что я прочитал, и (почему бы и нет?) Даже помогать и внести некоторые вклад в это очень репозиторий (PR благодарны).
Этот репозиторий содержит API Rails 6.x, в котором используется драгоценный камень SearchKick для получения отличных рекомендаций (по FTS) на основе ввода пользователя. Это простой крошечный HTTP API, который позволяет создавать посты с заглавными и телом (как вы увидите позже) и выполняют поиски, которые подходят к реальным хорошим рекомендациям, а не только сравнение строк Simples. Для этой цели я начну расследование, есть ли другие решения для подхода FTS, кроме Elasticsearch.
Простая «Googling» может принести вам кучу способов выполнения FTS в более общих СУБД, таких как MySQL или PostgreSQL. Почти всегда лучше выбрать более протестированную и распространять альтернативу против «нового» - даже Elasticsearch не такая молодая технология, касающаяся надежности сообщества и программного обеспечения. Так почему бы не выбрать старый серебряный буллет между PostgreSQL и MySQL?
Есть несколько способов, которыми мы можем иметь FTS в MySQL: поиск естественного языка и логический поиск. Поиск языка более четкий для нашего понимания, потому что он просто ищет слова за словом, сравнивая запрос с указанными вами полями. Строки, которые имеют больше переписок с вашей строкой запроса, будут забить больше и будут ранжироваться по этому мнению. Ноль баллов означает отсутствие переписки, и что ряды не возвращаются в 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, внедренные свои FTS с Java Lucene Engine. Это приносит нам кучу инструментов, таких как интерпретация Morppellings, Stemming и Special Hearses - Como Acentos na minha língua pátria! - и другие. Все эти вещи могут быть очень сложными для развития самостоятельно, поэтому это чрезвычайно оправдано использовать Elasticsearch, если вы ищете эти инструменты.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installОчень легко запускать контейнеры этих зависимостей Rails Service - 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.