2014-11-05 3 views
0

레일 4, PostgreSQL을 사용하는 레일 애플리케이션이 있고 Heroku에서 호스팅됩니다. 응용 프로그램은 사용자 및 문서 모델을 중심으로 구성됩니다. 사용자가 기사를 작성할 수 있습니다. 기사는 제목, 설명, 위치 (위도, 경도) 및 이미지를 포함합니다. 사용자가 키워드를 구독하도록 허용하는 좋은 방법은 무엇입니까

I는 다음과 같이 작동하는 알림 시스템 추가하고 싶습니다 :

  • 사용자가 설정 할 수 있습니다 그들이에 가입하고자하는 키워드 목록을.
  • 키워드 중 하나를 포함하는 기사가 제목에 추가되었지만 (시간에는 설명에 포함될 수 있음) 사용자에게 알림이 전송됩니다.

이것을 확장 가능한 방식으로 구현하는 가장 좋은 방법은 무엇입니까?

가장 간단한 형태로, 사용자가 알리고 싶은 키워드를 저장하는 키워드라는 모델을 만들 수 있습니다. 그런 다음 기사 작성 작업에서 제목 또는 설명에 저장된 키워드가 포함되어 있는지 확인하십시오.

이것은 좋은 것처럼 들리지만 합리적인 사용자가 추가되면 아마도 넘어 질 것입니다.

분명히, 백그라운드 작업은 트릭을하지만 여전히 데이터베이스에 직접 포함 된 기본 문자열을 수행하는 것은 잘못된 것처럼 보입니다.

아마도 제목과 설명을 색인으로 토큰 화하고 무거운 물건을 처리하기 위해 백그라운드 프로세스를 사용할 수 있습니까? Postgres에 텍스트 검색 기능이 내장되어 있다고 들었습니다. Solr 또는 Redis와 같은 Heroku 애드온을 사용하여이 모든 것을 처리 할 수 ​​있습니까? 아니면 과장입니까? (추가 기능을 지불 할 필요가 없다는 장점이 있습니다). 아마도 누군가 동일한 기능을 더 잘 구현할 수 있습니다.

나는 그것을 빨리 구현할 수 있음을 알고 있으며, 구현이 긁히지 않도록하고 싶다.

덕분에, 브라이언

답변

0

나는 비슷한 문제에 직면했다. 가장 느린 것은 대소 문자를 구분하지 않는 검색을 수행하는 것입니다. 제가 여러분에게 제안하고자하는 것은 다음과 같은 접근법입니다 : TID를 제목을 저장하는 행의 ID로 둡니다. 제목에있는 모든 단어에 대해 소문자로 된 행 하나와 해당 TID가있는 표를 만듭니다. 주어진 사용자의 단어와 키워드 사이에 조인이 필요합니다. 해시 인덱스를 사용하여이 쿼리의 속도를 높일 수 있습니다.

필자의 경우 모두 성능이 좋지 않아 postgres 텍스트 기능을 사용할 수 없었습니다.

PS 약 60000 개의 문서에서 전체 텍스트 검색을 구현 ​​했으므로 사례가 약간 다를 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. @ mark91 - 스키마가 Article 테이블 (id, title, ...), UserKeyword 테이블 (id, user_id, keyword)이 될 것이라고 말하고 기사가 작성되면 ArticleKeywords (id, article_id, keyword)에 제목을 추가 하시겠습니까? 문자열에 대한 조인이 꽤 느리지 않습니까? 정지 단어 (a, the, it ... 등)를 필터링해야하지만 작동 할 것입니다. –

+0

예, 당신이 옳습니다. 조인 (모든 것이 소문자이거나 대문자 인 경우)은'like' 연산자를 사용하는 것보다 훨씬 빠릅니다. 분명히, 당신이 숫자에 합류한다면 당신은 더 빨라지지만, 이제 당신은 문자열을 다루고 있습니다 ...또한 일부 인덱스는 이러한 방식으로 성능을 향상시킬 수 있습니다 (해시 인덱스 권장). 조인 인덱스를 사용하지 않으면 성능이 향상되지 않습니다. 원한다면이 솔루션을 사용해보십시오. 그러면 직접 공연을 예측할 수 있습니다. 덕분에 – mgaido

+0

. 나는 이것을 시험해 보려고 노력할 것이고 나는 그것이 어떻게 진행되는지 알려줄 것이다. –

관련 문제