2008-09-06 7 views
9

나는 하나의 솔루션을 개발했지만, 일부 성능 문제를 해결할 수있는 다른 아이디어를 찾으려고하는 webapp 개발 문제가 있습니다.How-to : 검색 결과 순위 지정

문제 설명 : 항목의 경우 각 토큰

  • 예에 대해 하나 개의 결과를 필요
  • 토큰에

    • 사용자가 입력 몇 가지 키워드/토큰 일치를위한
    • 응용 프로그램 검색, 3 개의 토큰을 가지고 있는데, 3 번 엔트리가 필요합니다.
  • ran 소수점 값 인 경우 포인트를 기준으로 항목 ID가
  • 같은, 사용 날짜가 정렬 토큰 경기의 결과를
  • 종류의
    • 할당 X 포인트 케이 결과

내가 할 수 있기를 원하지만, 알아 내지 못했지만 in()의 결과와 유사한 것을 반환하는 1 개의 쿼리를 보내지 만 각 토큰에 대한 중복 엔트리 ID는 각 엔트리 ID와 일치합니다.

토큰 당 하나의 쿼리를 실행하는 개별 쿼리를 여러 개 사용하는 것보다 더 나은 방법이 있습니까? 그렇다면 가장 쉬운 방법은 무엇입니까?

이미 항목을 토큰 화 때문에, 예를 들어, 하나의 항목 ID를 가지고 "현장 실행을 참조", 3 토큰, '볼'한
편집, '실행'을 '발견' 그 테이블은 다음과 같을 수 있도록 항목이 그들에게 관련 ID로, 별도의 토큰 테이블에 있습니다

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3 

답변

6

당신이 MySQL의에서 'UNION ALL'을 사용하여 하나 개의 쿼리에서이 achive 수 있습니다.

ALL 각 토큰에 대한 UNION을 만드는 PHP에서 토큰을 통해

그냥 루프 :

예를 들어 토큰이 경우 'X', 'Z' 'Y'및 쿼리이

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
     SELECT * FROM `entries` 
     WHERE token like "%z%" ORDER BY score ect... 
같은 것을 보일 수 있습니다

주문 조항은 필요한 전체 결과 세트에 대해 작동해야합니다.

성능 측면에서 볼 때 데이터베이스가 빠를수록 속도가 떨어지는 경우가 많습니다. 단, 속도면에서 주 오버 헤드는 PHP에서 데이터베이스 엔진에 쿼리를 보내고 결과를받는 경우가 많습니다. 이 기술을 사용하면이 작업은 토큰마다 한 번이 아니라 한 번 수행되므로 성능이 향상됩니다. 충분한 지 여부는 알 수 없습니다.

+0

@rmbarnes을 - 그 연합 작전 내가 다시 갑자기 이해가 DB 기본 년에서 본 곳이어야합니다; 나는 defintiely 전체 실행 속도로 비교하는 방법을 볼 수있는 성능 실행을주지. – warren

+0

그냥 UNION UN을 사용하는 것을 잊지 마십시오. 그렇지 않으면 당신이 원하는 것처럼 동일한 ID로 반환 된 여러 행을 얻을 것이라고 생각하지 않습니다. - rmbarnes, Sep 20 '08, 20:23 – warren

1

당신은 또한 귀하의 질의에 다음과 같은 부분으로 포함 할 수있는 모든 패턴 UNION을 사용하는 경우 : 이것은 당신에게 경기의 주파수를 얻을 않는 정말 사소한 예이지만

SELECT COUNT(*) AS C 
... 
GROUP BY ID 
ORDER BY c DESC 

을 각 결과와 이것으로 시작하는 의사 순위 일 수 있습니다.

0

데이터베이스가 아닌 검색 작업을 위해 설계된 데이터 구조를 사용하면 성능이 훨씬 좋아질 것입니다. 예를 들어 inverted index 건물을 살펴볼 수 있습니다. 그러나 직접 쓰는 것이 아니라 대부분의 작업을 수행하는 Lucene과 같은 것을 조사하는 것이 좋습니다.

3

이 질문에 대한 답변이 아니라는 것을 알고 있습니다. 그러나 테이블이 수백만 개가 아닌이 아닌 수천 개일 경우 FULLTEXT 솔루션이 가장 좋은 방법 일 수 있습니다.

MySQL에서 색인 된 열에 MATCH를 사용하면 제공 한 각 키워드에 관련성 점수 (각 키워드가 언급 된 횟수로 대략 계산)가 주어지며 이는 귀하의 방법보다 정확하고 분명 더 효과적입니다 여러 키워드에 대해

는 여기를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

관련 문제