2012-11-16 3 views
2

간단한 질문 하나는 PHP에서 preg_match이고 mysql 쿼리에서는 like이 동일합니까?두 테이블 사이의 mysql 비교 패턴 열

홈페이지 질문 :

다음 사항을 고려 내 두 테이블의 표 1 및 표 2

표 1                                 0123입니다                                                                        01,237 당신이 iPad 2 WiFi 16GBiPad2 WiFi 16GB 또는 iPod Touch(4th Gen)8GBiPod Touch 4th Generation 8GB을 모두 볼 수있는 2

 
+-------+-------------------------+  +-------+------------------------------+ 
| ID | Model     |  | ID | Model      | 
+-------+-------------------------+  +-------+------------------------------+ 
| 1  | iPad 2 WiFi 16GB  |  | 1  | iPad2 WiFi 16GB    | 
| 2  | iPhone 4S 16GB   |  | 2  | iPhone4S 16GB    | 
| 3  | iPod Touch(4th Gen)8GB |  | 3  |iPod Touch 4th Generation 8GB | 
+-------+-------------------------+  +-------+------------------------------+ 

지금 내가 싶은 일을 할 819,                              표는이 두 테이블을 비교하는 것입니다 그들은 동일하지 않지만 내 질문에 넣으면 표시하지 않습니다 where Table1.model = Table2.model 그들은 아니오 정확한 일치. 내가 뭘하고 싶은거야 like 또는 anyother 방법을 사용하여 mysql 쿼리와 이러한 행을 비교할 것이다 그래서 그것은 모두 테이블 행을 비교할 것이다. 친절하게 그 같은 SQL 쿼리를 작성하는 방법을 알려주십시오.

다음 SQL 쿼리를 시도했지만 위의 예제에서 언급 한 행 유형을 반환하지 않은 것처럼 모든 행을 반환하지 않았습니다.

SELECT table1.model as model1, table2.model as model2 
FROM table1,table2 WHERE table1.model REGEXP table2.model 
+2

'FULLTEXT Search'에 대해 읽어보세요. 아마도 도움이 될 것입니다. –

+0

보통 이런 종류의 일은 '키워드'가있는 세 번째 테이블과이 테이블을 당신과 같은 테이블과 일치시키는 테이블을 통해 수행됩니다. 행당 하나의 핵심어가이 행에 참여하고 히트 수로 순위를 매 깁니다. – ethrbunny

+1

@ 존우 좋아요. 그걸 들여다 보겠습니다. ..... –

답변

1

두 가지 질문 - 설명이 표준입니까 (설명이 변경되지 않습니까?) 또는 사용자가 입력 했습니까? 표준 인 경우 정수 열을 추가하고이 열을 비교합니다.

사용자가 입력 한 경우 퍼지 검색이 더 필요한 항목을 찾고 있기 때문에 작업이 더욱 복잡해집니다. 바이 그램 검색 알고리즘을 사용하여 두 문자열 간의 유사성을 평가했지만, 이는 mySQL에서 직접 수행 할 수 없습니다.

퍼지 검색 대신 LIKE를 사용할 수 있지만 검색어의 시작 부분에 '%'를 입력하면 테이블 스캔 만 수행 할 수 있습니다. 또한, 당신이 선택한 부분 문자열 부분에 일치하는 것을 얻을 수 있다는 것을 의미합니다. 즉, 부분 문자열을 사전에 알아야 할 필요가 있습니다.

내가 무엇을 하려는지 한 번 더 자세히 설명해 드리겠습니다.

EDIT1 : 좋아, 당신의 고심을 감안할 때, 내가 언급 한 것처럼 퍼지 스타일 검색을 수행해야합니다. 나는 바이 그램 방법을 사용하는데,이 방법은 사용자가 만든 각 항목을 가져 와서 2 또는 3 자로 나눠서 처리합니다. 그런 다음 각 청크를 실제 테이블에 다시 입력하여 다른 테이블에 저장합니다.

예 :

설명 1 : "앞으로 빠른 실행" 설명 2 : "앞으로 짧은 실행"

당신이이 개 문자 청크로 각을 어기면 - 'A', 'F', 'FA ..... ','as ','st '.....

두 문자열에 일치하는 2 개의 char 청크 수를 비교하여 두 문자열 간의 정확도 또는 유사성을 나타내는 "score"를 얻을 수 있습니다.

어떤 개발 언어를 사용하고 있는지 알 수 없으므로 구현을 생략하겠습니다.하지만 이는 mySQL에서 명시 적으로 수행하지 않아도됩니다.

또는 게으른 대안은 아마존과 같은 클라우드 검색 서비스를 사용하는 것입니다. 사용자가 제공하는 조건에 따라 검색을 제공 할 것입니다 ... 사용자가 지속적으로 고려할 새로운 설명을 추가 할 수 있는지 확실하지 않습니다. 귀하의 응용 프로그램, 그것은 약간 비싸 수 있습니다 (IMHO). 또 다른 그래서 음절의 구현에 게시물에 대한

R

- 볼이 SO bigram/fuzzy search

질문자 정교 당

--- 업데이트 ---

첫째, 당신이 이론을 읽을 수 있으리라 믿고있어 내가 제공 한 링크 .. 둘째, MySQL 데이터베이스가 필요 없기 때문에 가능한 한 DB에 대해 알지 못하게하려고 노력할 것입니다. (필자는 그것을 사용하지만 괜찮습니다.)

그래, bigram 방법은 메모리에서의 비교/비교에서 잘 작동합니다. 가능한 일치 항목이 상대적으로 작은 경우에만 배열을 생성합니다. 그렇지 않으면 색인이없는 mysql 테이블과 같은 테이블 스캔 성능이 상당히 빠르게 저하됩니다. 따라서 색인 생성을 돕기 위해 데이터베이스 강점을 사용할 것입니다.

사용자가 원하는 "용어"를 입력 할 수있는 테이블 하나 또는 비교하려는 텍스트가 필요합니다. 가장 간단한 형식은 두 개의 열이있는 테이블입니다. 하나는 색인이 생성되는 고유 한 자동 증가 정수이고, 아래에 hd_id가 호출되며 두 번째는 문자열이 매우 짧으면 varchar (255), 가능한 경우 TEXT입니다. 오래 걸릴 수 있습니다 - 당신이 원하는대로 이름을 붙일 수 있습니다.

그런 다음, 당신은 적어도 세 개의 열이있는 다른 테이블 확인해야합니다 - 다시 다른 테이블의 자동 증가 컬럼에 대한 참조 열의 하나를 (우리가 아래이 hd_id 전화 할게)을, 두 번째가 될 것 varchar()는 최대 5 개 문자 (bigram 덩어리를 담을 것입니다)를 말하며, 아래에 "bigram"이라고하고, 세 번째 문자는 b_id라는 자동 증가 열을 말합니다. 이 테이블은 각 사용자의 항목에 대한 모든 bigram을 보유하고 전체 항목에 다시 연결됩니다. varchar 열을 단독으로 (또는 복합 인덱스에서 첫 번째로) 색인화해야합니다.

이제 사용자가 검색하려는 용어를 입력 할 때마다 첫 번째 표에 용어를 입력 한 다음이 용어를 bigram으로 해부하고 두 번째 표에 각 청크를 다시 입력해야합니다 첫 번째 테이블의 전반적인 용어는 관계를 완료합니다.이 방법을 사용하면 PHP에서 해부를 수행하지만 mySQL 또는 데이터베이스를 통해 인덱스 최적화를 수행 할 수 있습니다. bigram 단계에서 계산 단계를 위해 표 1에있는 bigram 수를 저장하는 데 도움이 될 수 있습니다. 다음은 PHP에서 일부 코드는 당신에게 bigrams을 만드는 방법에 대한 아이디어를 제공하는 것입니다 :

// split the string into len-character segments and store seperately in array slots 
function get_bigrams($theString,$len) 
{ 
    $s=strtolower($theString); 
    $v=array(); 
    $slength=strlen($s)-($len-1);  // we stop short of $len-1 so we don't make short chunks as we run out of characters 

    for($m=0;$m<$slength;$m++) 
    { 
     $v[]=substr($s,$m,$len); 
    } 
    return $v; 
}  

이 문자열에 공백에 대해 걱정하지 마십시오을 - 그들은 실제로 당신이 퍼지 검색에 대해 생각하면 정말 도움이입니다.

bigrams를 가져 와서 테이블에 입력하고 표 1의 전체 텍스트와 색인 된 열을 연결하면 ... 이제 무엇을 할 수 있습니까?

이제 "내 즐겨 찾는 검색어"와 같은 용어를 검색 할 때마다 php 함수를 사용하여 bigram의 배열로 바꿀 수 있습니다. 그런 다음 이것을 사용하여 bigram 테이블 (2)에있는 SQL 문의 IN (..) 부분을 만듭니다. 쉼표 내파 또는 배열에 어떤이 get_bigrams에서 반환 또는 사용하여 음절 함수에서 분리 된 목록으로 사용자가 직접이를 구성 할 수 - 나는 PHP 문자열 기준으로 $의 sqlstr을 떠 났어요

select count(b_id) as matches,a.hd_id,description, from table2 a 
inner join table1 b on (a.hd_id=b.hd_id) 
where bigram in (" . $sqlstr . ") 
group by hd_id order by matches desc limit X 

: 다음은 예입니다 원하는 경우 매개 변수화하십시오.

위의 쿼리를 올바르게 수행하면 선택한 bigram의 길이에 따라 가장 근접하게 일치하는 퍼지 검색 용어가 반환됩니다. 선택한 길이는 전체 검색 문자열의 예상 길이에 따라 상대적 효능이 있습니다.

마지막으로 위 쿼리는 퍼지 일치 항목을 제공합니다. 매치뿐만 아니라 짧은 문자열에 비해 긴 검색 문자열을 디 바이어스하는 데 도움이되는 전체 bigram 카운트와 비교하여 비교할 수 있습니다. 이 시점에서 더 많은 응용 프로그램에 적용되기 때문에 여기서 중단했습니다.

희망이 도움이됩니다.

+0

모델이 사용자에 의해 입력되었으므로, 같은 것을 의미한다면 일치하고 추출해야합니다. iPod Touch (제 4 세대) 8GB, iPod Touch 4 세대 (8GB) iPod touch와 같은 의미를 지니고있어 모두 비슷합니다. 이런 종류의 방식으로 비교해야합니다. –

+0

여기 간단한 버전 검색 답변에 대한 링크가 있지만, 당신의 정성을 바탕으로, 나는 이것이 할 것이라고 생각하지 않습니다. http://stackoverflow.com/questions/3276904/mysql-conduct-a-fuzzy-search – Ross

+0

나는 PHP를 사용하고 있으며 친절하게도 bigram이 정확하게 similar_text 나 ​​Levenshtein 또는 PHP에서 metaphone으로 작동하는지 알려주고 싶습니까? –