2017-02-07 1 views
0

テーブルfirst_nameとlast_name(PostgreSQL)に2つのカラムがあります。この場合、全文検索を実装する必要がありますか?代替案?

フロントエンドでは、ユーザーがユーザーを検索できるようにするための入力があります。これは、姓や名で人を検索するためのWebサービスを呼び出すオートコンプリートフィールドです。

現在、私は(私のクエリビルダを使用して)、クエリ作った:私は "を探していますので、もし

 $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); 
     } 

をしかし、このクエリは、それが必要なほど正確ではない、それは使用していますORすべての単語についてRasmus Lerdorf "は私に" Rasmus Adams "と" Adel Lerdorf "を与えてくれます。これは、単一の単語(例えば "Rasmus")を入力した場合にのみ機能します。この場合は、 "Rasmus"を持つすべての人にfirst_nameまたはlast_nameとして与えられます。

私はMATCH AGAINSTについて読んでいますが、PostgreSQLを使用しています。私はまた、PostgreSQLの全文検索機能をMATCH AGAINSTと同等のものとして聞いていましたが、全文検索を実装することがそのような目的のために過度のものになるのではないかと思っています。(特に、両方の列の単語の最大数が4)。

私はあなたのアドバイスをお願いします。あなたのいつもの助けが常に感謝しています。ありがとう

答えて

0

フルテキスト検索は必要ありません。

だけで、代わりのまたは異なる検索用語を追加します。私も(用語を検索するユーザーの開始と終了に「%」を追加)の代わりに等価比較でLIKE使用することをお勧めします

$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); 
} 

おそらく$query->expr()->lower()を適切に追加することで大文字と小文字を区別しないようにすることもできます。

関連する問題