2012-05-06 2 views
1

값 $ keyword_search에 하나 이상의 키워드를 사용하는 PHP/mySQL 검색 기능이 있습니다. 문제는 모든 키워드와 일치한다는 것입니다. 검색이 완료되면 누군가가 "우유 맥주"를 검색하는 경우 "우유"또는 "맥주"만을 포함하는 결과를 반환합니다. 문자열에 모든 키워드가 포함되도록 결과를 변경하려면 어떻게해야합니까? 어떤 도움을 주시면 더 좋구요어떻게 PHP/REGEXP를 모든 키워드와 일치시킬 수 있습니까?

$query[] = "((a.name REGEXP '()*(" . str_replace(' ', ')*()*(', $keywords_search) . ")()*') 
OR (a.description REGEXP '()*(" . str_replace(' ', ')*()*(', $keywords_search) . ")()*'))"; 

:

다음은 코드입니다!

답변

0

당신은 당신의 키워드 같은 것을 할 수있다 : 정규 표현식에 비해

$keywords = array('key', 'word'); 

$keywordQuery = []; 

foreach ($keywords as $keyword) { 
    $keywordQuery[] = "((a.name REGEXP '()*({$keyword})()*') AND (a.description REGEXP '()*({$keyword})()*'))"; 
} 

$query = implode(' AND ', $keywordQuery); 

더 나은, 당신은 또한 검색의 MySQL의 전체 텍스트를 사용할 수 있다면 할 수 있습니다 - Boolean Full-Text Searches.

+0

'$ keywords_search'가'a | b | c'와 같은 경우 아마 작동하지 않을 것입니다. 키워드 중 하나라도 일치합니다. –

+0

그래, 그게 문제 야. 이 스크립트는 약간의 복잡성으로 인해서 MySQL의 명령을 사용하지 못하게합니다. ( – user1227914

+0

) 대신 MySQL의 전체 텍스트 검색을 사용 했습니까? –

1

키워드를 정규화 된 하위 테이블에 넣는 것이 좋을 것입니다. 이렇게하면 검색이 간단 해집니다. MySQL의 정규식 매칭 (regex matching)은 얼마나 많은 일련의 alternation이 매치되어야 하는지를 지정하는 것을 허락하지 않는다.

예컨대

SELECT count(*) AS cnt 
FROM keywords 
WHERE keyword IN ('a', 'b', 'c') 
GROUP BY id 
HAVING (cnt = 3) 

특정 ID가 존재하는 세 가지 키워드가 만 레코드를 가져올 것입니다. 정규식 버전과 않은 정규화 된 문자열 필드와

여러 별도의 정규 표현식에로 키워드를 분리해야하고 AND

예를 들어, 그들을 체인 것

SELECT ... 
FROM ... 
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND .... 
+0

예, 문제가 있습니다. 스크립트는 추가 전후 약간 복잡합니다. 내게 MySQL 명령을 사용하지 못하게하는 것들 :( – user1227914

관련 문제