2010-05-06 5 views
2

확장 성있는 전체 텍스트 검색을 생성하고 사용자별로 정렬해야하는 결과가있는 옵션에는 어떤 것이 있습니까? 이것은 PHP/MySQL (Symfony/Doctrine도 관련이있다)을위한 것이다.사용자 별 결과 확장 가능 전체 텍스트 검색

여기에는 사용자가 수행 한 운동 데이터베이스가 있습니다. 사용자가 이전에 해본 운동은 결과 상단에 나타나야합니다. 운동을 자주 마칠수록 검색 결과에 나타나는 운동이 높아집니다. 도움이된다면 사용자가 사전에 운동을 한 횟수를 알고 있다고 가정 할 수 있습니다.

가능한 해결책

스핑크스를 - 사용 스핑크스, 전체 텍스트 검색을 구현하는 모든 질의와 MySQL에 정렬 할 수 있습니다. 이것은 유망한 것으로 보인다 (그리고 Symfony Plugin이있다!) 그러나 나는 그것에 대해 많이 모른다.

Lucene - 전체 텍스트 검색을 수행하고 사용자의 완료를 쿼리에 넣으려면 Lucene을 사용하십시오. this Stack Overflow thread에 나와 있습니다. 또는 Lucene을 사용하여 결과를 검색 한 다음 PHP로 다시 정렬하십시오. 그러나 사용자가 수백 가지 운동을 완료했을 때 두 솔루션 모두가 어색하고 잠재적으로 확장 할 수없는 것처럼 보입니다.

Mysql - 기본 전체 텍스트 지원 (InnoDB)이 없으므로, 확장 성이없는 LIKE 또는 REGEX를 사용해야합니다.

답변

2

MySQLFULLTEXT 네이티브를 가지고 있지만, MyISAM 테이블에서만 지원됩니다.

대부분의 실제 작업에서 가장 빠른 엔진은 Sphinx입니다. 그러나 외부 인덱스이므로 cron 스크립트를 사용하여 적시에 업데이트 할 수 있습니다. SphinxSE를 사용하여

(Sphinx에 플러그 MySQL 인터페이스), 당신은 MySQL 테이블과 하나 개의 쿼리에서 Sphinx 인덱스를 가입 할 수 있습니다. 그러나 업데이트에는 외부 스크립트가 필요합니다.

수행되는 운동 횟수가 자주 변경되는 것 같습니다. Sphinx에 유지하면 색인을 다시 작성하는 데 많은 시간이 걸립니다.

SELECT * 
FROM workouts w 
JOIN user_workouts uw 
ON  uw.workout = w.id 
WHERE w.query = 'query query query;filter=user_id,$user_id' 
     AND uw.user = $user_id 
ORDER BY 
     uw.times_performed DESC 
0

당신이 기어 오를 것 루씬을 사용하여 가정하는 이유를 잘 모르겠어요 :

SphinxSE으로, 당신은 유사한 쿼리를 작성할 수 있습니다. 사용자 당 수백 번의 운동은 대처할 데이터가 아닙니다.

검색 백엔드에 Solr/Lucene을 사용해보십시오. 그것은 당신의 PHP 프론트 엔드와 멋지게 연동 할 JSON/XML 인터페이스를 가지고 있습니다. 데이터베이스 테이블에 사용자의 완성 된 운동 #을 저장하십시오. 쿼리가 실행되면 Solr에서 결과를 가져 와서 PHP 코드에서 데이터베이스 테이블과 리조트에서 선택할 수 있습니다. 충분히 빠르고 확장 가능해야합니다. Solr을 사용하면 색인을 유지 관리하는 것이 간단합니다. Solr 서버에 add/update/delete 요청 만하면됩니다.

+0

사용자는 몇 백 개만 완료했지만 총 수십만 개의 운동을 지원해야합니다. Solr/Lucene을 사용하여 수백만 회의 운동을 검색 한 다음 결과의 순서를 바꾸라고 제안 하시겠습니까? 일부 검색은 레코드의 상당 부분을 반환 할 수 있습니다. –