2017-02-07 2 views
0

나는 first_name과 last_name 테이블 (PostgreSQL)에 두 개의 컬럼을 가지고있다.이 경우 전체 텍스트 검색을 구현해야합니까? 대안?

프론트 엔드에는 사용자가 사람들을 검색 할 수있는 입력란이 있습니다. 자동 완성 필드로 사람을 성 및/또는 이름으로 검색하기 위해 웹 서비스를 호출합니다.

현재, 나는 (내 쿼리 빌더 사용) 쿼리를 만든 :

 $searches = preg_split('/\s+/', $search); 

     if (!empty($search)) { 
      $orX = $query->expr()->orX(); 
      $i = 0; 
      foreach ($searches as $value) { 
       $orX->add($query->expr()->eq('c.firstName', ':name'.$i)); 
       $orX->add($query->expr()->eq('c.lastName', ':name'.$i)); 
       $query->setParameter('name'.$i, $value); 
       $i++; 
      } 
      $query->andWhere($orX); 
     } 

을하지만,이 쿼리가 필요한만큼 정확하지, 그것은 사용 또는 모든 단어에 대해 나는 "찾고 있어요 그래서 만약 Rasmus Lerdorf "는 또한"Rasmus Adams "와"Adel Lerdorf "를 제공합니다. 그것은 하나의 단어 ("Rasmus"예를 들어)를 입력 할 때만 작동합니다.이 경우에는 "Rasmus"를 가진 모든 사람들이 first_name 또는 last_name으로 제공됩니다.

나는 MATCH AGAINST에 대해 읽었지만 PostgreSQL을 사용하고 있습니다. 나는 또한 PostgreSQL에서 Full Text Search 기능에 대해 MATCH AGAINST와 동일한 것으로 들었지만 전체 텍스트 검색을 구현하면 이러한 목표에 과도 함이 될지 궁금해졌습니다. 특히 두 열 모두에서 최대 단어 수가 초과하지 않는지 궁금합니다. 4).

귀하의 조언을 부탁드립니다. 귀하의 평소 도움은 언제나 감사하겠습니다. 감사합니다.

답변

0

전체 텍스트 검색이 필요하지 않습니다.

그냥 함께 다른 검색어를 추가하고 대신 OR :

$i = 0; 
foreach ($searches as $value) { 
    $orX = $query->expr()->orX(); 
    $orX->add($query->expr()->eq('c.firstName', ':name'.$i)); 
    $orX->add($query->expr()->eq('c.lastName', ':name'.$i)); 
    $query->setParameter('name'.$i, $value); 
    $i++; 
    $query->andWhere($orX); 
} 

또한 (용어 검색 사용자의 시작과 끝에 '%'를 추가) LIKE 대신 동등 비교를 사용하는 것이 좋습니다 것입니다 $query->expr()->lower()을 적절히 추가하여 대소 문자를 구별하지 않게하십시오.