php - 최적화 - 티스토리 seo




방법:검색 결과 순위 지정 (3)

UNION ALL 패턴을 사용하는 경우 쿼리에 다음 부분을 포함 할 수도 있습니다.

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

이것은 매우 사소한 예이지만 각 결과에 대한 일치 빈도를 얻지 만 이것은 처음부터 의사 순위 일 수 있습니다.

나는 하나의 솔루션을 개발했지만, 지금보고있는 성능 문제를 해결할 수있는 다른 아이디어를 찾으려고 노력하고있는 webapp 개발 문제가 있습니다.

문제 설명:

  • 사용자가 여러 개의 키워드 / 토큰을 입력 함
  • 응용 프로그램은 토큰과 일치하는 항목을 검색합니다.
  • 각 토큰마다 하나의 결과가 필요하다.
    • 즉, 항목에 3 개의 토큰이 있으면 항목 ID가 3 번 필요합니다.
  • 결과의 순위를 매기다
    • 토큰 매치를위한 X 포인트 할당
    • 포인트에 따라 엔트리 ID 정렬
    • 포인트 값이 같은 경우 날짜를 사용하여 결과 정렬

내가 뭘 할 수 있고 싶지만, 알아 내지 못했지만, in ()의 결과와 비슷한 것을 반환하는 하나의 쿼리를 보내지 만, 체크 된 각 엔트리 ID에 대해 각 토큰에 대한 중복 엔트리 ID를 반환합니다.

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

편집하다
저는 이미 항목을 토큰 화했습니다. 예를 들어, "see spot run"은 엔트리 id가 1이고 세 개의 토큰 인 'see', 'spot', 'run'이 있고 그것들은 별도의 토큰 테이블에 있습니다. 엔트리 아이디가 그들과 관련이 있으므로 테이블은 다음과 같이 보일 것이다 :

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

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

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

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


당신은 MySQL에서 'UNION ALL'을 사용하여 하나의 쿼리로 이것을 수행 할 수있다.

PHP에서 각 토큰에 대해 UNION ALL을 만드는 토큰을 반복하면됩니다.

예 : 토큰이 'x', 'y'및 'z'인 경우 쿼리가 다음과 같이 보일 수 있습니다.

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...

order 절은 필요한 전체 결과 세트로 작동해야합니다.

성능면에서 볼 때 그다지 빠르지는 않을 것입니다. 그러나 데이터베이스의 경우 속도 측면에서 주요 오버 헤드는 종종 PHP에서 데이터베이스 엔진에 쿼리를 보내고 결과를받는 것입니다. 이 기법을 사용하면이 작업은 토큰 당 한 번이 아니라 한 번 수행되므로 성능이 향상됩니다. 충분한 지 여부는 알 수 없습니다.







search