2017-08-08 12 views
2

空白で区切られた文字列のすべての順列について、データベース列varcharを検索したいとします。例:すべての文字列置換をMysqlで検索

search: foo 
matches: foo, foo bar, bar foo 

search: foo bar 
matches: foo bar, bar foo, bar foo green, green foo bar 

私はPHPでPDOを使用して検索を行っています。多くの単語を含む文字列を作成して検索する際には、作成して含めることができる多くの置換があるため、スピードの問題があります。以下は、私が順列を生成するために使用しているPHPコードです。多分、用語の数を減らす方法がありますか?

function permutations($set) { 
    $solutions = array($set); 
    $n = count($set); 
    $p = array_keys($set); 
    $i = 1; 
    while ($i < $n) { 
     if ($p[$i] > 0) { 
      $p[$i]--; 
      $j = 0; 
      if ($i % 2 == 1) 
       $j = $p[$i]; 
      //swap 
      $tmp = $set[$j]; 
      $set[$j] = $set[$i]; 
      $set[$i] = $tmp; 
      $i = 1; 
      $solutions[] = $set; 
     } 
     elseif($p[$i] == 0) { 
      $p[$i] = $i; 
      $i++; 
     } 
    } 
    return $solutions; 
} 

答えて

0

あなたのロジックは、文字列/文章のどこでもデータベース列に1つ以上のキーワードが存在するかどうかを単純にチェックするのと同じです。もしそうなら、次のタイプのクエリは、あなたのために十分であるかもしれない:

SELECT * 
FROM yourTable 
WHERE 
    column LIKE CONCAT('%', 'foo', '%') AND 
    column LIKE CONCAT('%', 'bar', '%') 

あなたがこの種のかなりの作業を行う上で計画している場合、MySQLのフルテキスト検索機能に関するいくつかの学習を投資するあなたの中の価値があるかもしれません。あなたがテーブルの上にフルテキストインデックスを持っていた場合は、次のようなクエリはまた、あなたが心に持っているものに近いものになります。

SELECT * 
FROM yourTable 
WHERE MATCH(column) AGAINST('foo,bar') 
+0

たぶん私は私の質問でこれをうまく表現していないかもしれませんが、検索語に2語があれば、両方の答えにしたいと思っています。 –

+0

@JohnCarroll私のクエリがこの要件を満たしています。あなたはそれを試してみましたか?私は各検索語の存在をチェックし、すべてが存在する場合にのみレコードが返されます。 –

+0

いいえ、私はテストをしなかった、私は説明を読んで、それは近いが、一致しないと思った。私は今試してみる。 –

0

は、私は私のプロジェクトで私の機能を使用します。 この関数cheskは$列を行います$ whatに似ていますか?例えば

student = smith 
what= mike smith 
result:YES 

https://3v4l.org/eUOS1

とあまりにも逆に:

student =mikesmith 
what= smith 
result:YES 

function TRIM_SEARCH_TABLE_UNIQ($column,$what) 
{ 
$Find=0; 

    $e1=strpos('0'.trim(strtolower($column)),trim(strtolower($what))); 
    $e2=strpos('0'.trim(($what)),trim(strtolower($column))); 
    if(($e1>0)||($e2>0)) 
     { 
      $Find=1; 
      return "YES"; 
     } 

return "NO"; 
} 
+0

これは便利な機能ですが、照会中に検索を実行したいと考えています。さもなければ、私はすべての行を引っ張って(ALOT)、この機能を実行しなければなりません。 –

0

あなたは、文字列のすべての順列のためMATCH AGAINSTを試すことができます。

SELECT * FROM table WHERE MATCH(column) AGAINST ('foo bar'); 

試合:たとえばFOOバー、バーFOO、FOOバーの緑、緑のバーFOO、FOO緑色のバー、あなたの要求のために、しかし緑FOO、FOO、バー


をバー、

$search_string = "foo bar"; 
$search_string = "+". str_replace(' ', " +", $search_string); 

と、このようなSQLを実行します:

0123あなたは、検索文字列のすべての単語で +演算子を追加するためにいくつかの変更を行うことができます
SELECT * FROM table WHERE MATCH(column) AGAINST ('$search_string' IN BOOLEAN MODE); 

試合:FOOバー、バーFOO、FOOバーの緑、緑のバーFOO、FOO緑色のバー、バー緑のfoo


は、カラム構造上のフルテキストインデックスを追加することを忘れないでください:

ALTER TABLE table ADD FULLTEXT (column); 

全文検索参照:link

+0

これはこれまで私が探しているものに最も近いものです。私はマッチ/嫌いについては知らなかった。私に見せてくれてありがとう!唯一の問題は、 'foo bar'が' foo'または 'bar'にマッチするようにしたくないということです。私は 'foo bar'、' bar foo'、 'bar foo green'とマッチするようにしたいと考えています。 –

+0

私は答えを編集しました。それは助けてくれるでしょう:) –

+0

驚くべきこと - ティムの答えに対して賢明です。 –