이 저장소를 구축하려는 의도는이 주제에 대한 간단한 지식과 같은 전체 텍스트 검색 또는 FTS를 공유하는 것이 었습니다. 보시다시피, 나는 그 결론에 도달하기 위해 약간의 테스트와 연구를 만들었습니다. 마지막 섹션의 일부 링크는 내가 읽은 내용을 이해하고 싶어하는 사람이라면 누구나이 저장소에 도움을주고 기여하는 데 도움이 될 수 있습니다 (PR은 감사합니다).
이 저장소에는 SearchKick Gem을 사용하여 사용자의 입력을 기반으로 큰 권장 사항 (FTS)을 생성하는 Rails 6.x API가 포함되어 있습니다. 그것은 단순한 작은 HTTP API로, 제목과 바디 필드가있는 게시물을 만들 수 있으며 (나중에 볼 수 있듯이) 문자열 비교뿐만 아니라 진정한 좋은 권장 사항에 접근하는 검색을 수행 할 수 있습니다. 이를 위해 Elasticsearch 외에 FTS 접근법에 대한 다른 솔루션이 있는지 조사하기 시작합니다.
간단한 "Googling"은 MySQL 또는 PostgreSQL과 같은보다 일반적인 DBM에서 FTS를 수행하는 여러 가지 방법을 제공 할 수 있습니다. "새로운"에 대한보다 시험을 받고 확산 된 대안을 선택하는 것이 거의 항상 낫습니다 . 심지어 Elasticsearch조차도 커뮤니티 및 소프트웨어 신뢰성에 관한 기술이 아닙니다 . 그렇다면 Postgresql과 MySQL 사이의 오래된 실버 롤렛을 선택하지 않겠습니까?
MySQL에서 FTS를 가질 수있는 몇 가지 방법 인 자연어 검색 및 부울 검색이 있습니다. 언어 검색은 단순히 쿼리를 지정한 필드와 비교하는 단어별로 검색하기 때문에 이해력이 더 명확합니다. 쿼리 문자열에 더 많은 서신을 가진 행은 더 많은 점수를 매기고이 점수로 순위가 매겨집니다. 0 점은 서신이 없으며 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 엔진으로 FT를 구현했습니다. 그것은 우리에게 틀린 해석, 스템 밍 및 특수 특성과 같은 많은 도구를 제공합니다 -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 서비스 종속성 (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.2Docker를 처음 사용하고 이미지를 실행하는 데만 이것을 가지고 있다면 다음과 같이 실행하여 꺼질 수 있습니다.
$ 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 검색 및 생성에 대한 우체부에 대한 간단한 문서를 얻을 수 있습니다.