2012-01-28 5 views
0

제품이 포함 된 사이트에 대한 미니 검색 엔진을 만들려고합니다. 필자는 이미 전체 텍스트 검색, LIKE 절 등을 고려해 왔지만, 데이터베이스가 엄청나게 (수억 개의 제품) 엄청나게 많아 져서 계속 진행하고 싶습니다.복잡한 MySQL 선택 문

디자인은 다음과 같이 진행됩니다. 단어 쌍에 단어 ID가있는 테이블이 있습니다. 제품이 일치하는 제품 ID에 모든 단어 ID 쌍이 들어있는 다른 표가 있습니다. 사용자가 "2GB 메모리 카드"를 검색하면 스크립트는 "2GB" "메모리"와 "카드"를 구문 분석합니다.

은 그럼 내가 사용

SELECT pid 
    FROM indx_0 
WHERE wid = 294 OR wid = 20591 OR wid = 330 

나는 제품을 일치하는 단어의 쌍 끝.

여러 제품에 따라 어떤 제품이 맨 위에 올지를 결정하는 PHP 알고리즘이 있습니다. 하지만 내가 PHP 배열에 380k 결과를로드하면 실행 시간이 엄청나게 느려집니다. 너무 명확하게, 나는 그것을 할 수 없다. 하지만 말 한마디로 말하면 단어 당 1000 개의 결과가 나오지만 실행이 빠르지 만 가능한 모든 결과가 포함되지는 않습니다.

"indx_0"테이블에서 각 "pid"(제품 ID)는 "wid"(단어 ID)에 고유합니다. 분명히 일부 제품은 두 개 이상의 일치가 발생합니다. 나는 "wid"와 가장 일치하는 "pid"를 검색하고 싶습니다.

"2GB"및 200,000 개의 "카드"와 일치하는 2000 개의 제품과 해당 단어의 3 개 모두와 일치하는 20 개의 제품과 해당 단어 2 개 조합과 일치하는 200 개의 제품이 있다고 가정 해보십시오.

부분적으로 일치하는 200 개 제품과 20 개 제품을 검색 할 수 있습니까?

답변

2

아마도해야 할 일은 제품 ID별로 그룹화하고 일치하는 개수를 얻는 것입니다. 그런 다음 하강 가장 카운트에 의해 순서를 히트가 ... 3 카운트가

SELECT pid, count(*) WordMatchCount 
    FROM indx_0 
    WHERE pid in (294, 20591, 330) 
    group by pid 
    order by WordMatchCount desc 
    limit 1000 
+0

와우 너무 감사 목록에 첫번째 것, 즉이 : 하나 개의 제품은 3 WIDS 일치 및 기타는 1 일치! 내가 바꿀 필요가있는 것은 단 한가지뿐입니다. "어디서 pid가"실제로 "어디서"들어 있죠. 그것이 내가 원했던 것처럼 작동한다는 것 이외에. – nick