2

検索できるフィールドを生成するために、mySQL で連結しました。これには、クライアント データベースの所有者の名前とアドレスだけでなく、動物も含まれています。動物の名前、飼い主の名前、郵便番号で任意の順序で検索できるようにする必要があります。したがって、私の名前が john smith で、Fido という犬を飼っていて、郵便番号が AB1 2CD に住んでいる場合、次のいずれかを入力すると、検索結果が得られるようになります。

「john fido AB1」「john AB1」「AB1 john」「AB1 fido」「fido 2CD」「2CD」「fido」など... つまり、フィールドのいずれかを任意の順序で入力し、完全な単語でもないので、「john fido AB1" は、"jo fi AB1" と同じ結果になるはずです。

私は現在、この PHP コードを持っています。検索ページで単一のテキスト フィールドを取得し、それを分解してから内破して、検索用語の間に % を追加します。

$list = explode(' ',$_GET["q"]);  
$q = implode('%%', $list);
if (!$q) return;  
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,owner.OwnerID
FROM owner
Inner Join patient ON owner.OwnerID = patient.OwnerID
WHERE CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) LIKE '%$q%'";

これは "AB1 john" と "john fido" では機能しますが、"fido john" では機能しません。

どんな助けでも大歓迎です

4

3 に答える 3

1

キーワードを分割し、キーワードの文字列内のキーワードごとにクエリを追加する必要があると思います。

最初に (PHP で)、クエリ文字列を分割し、SQL クエリを動的に生成してから、データベースに送信します。私が何を意味するかを示すための擬似コードを次に示します。

$keywords = explode(' ', $q);
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim, 
    owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,
    owner.OwnerID

    FROM owner 
    Inner Join patient ON owner.OwnerID = patient.OwnerID";

$first = true;

foreach($keyword in $keywords):
    if($first):
        $sql += " WHERE ";
        $first = false;
    else:
        $sql += " AND ";

    $escaped = mysql_real_escape_string($keyword);
    $sql += " CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
        owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) 
        LIKE '%$escaped%'";

ただし、日常の操作でおそらく遭遇するテーブルのサイズに対して、これはどこにも近い速度ではないことに注意してください。ライブラリを使用するか、トリガーによって維持されるキーワードの相互参照テーブルを作成するかを問わず、全文検索を行うためのより良い方法を検討することをお勧めします。

于 2010-02-24T01:29:58.177 に答える
1

MySQL の全文検索 (MyISAM テーブルのみ!) が役に立つかもしれません。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

于 2010-02-24T06:51:37.590 に答える
0

これを試すことができます http://www.sphinxsearch.com/

これを実行するには専用サーバーが必要ですが、もしあれば、sphinx は問題を簡単に解決し、クエリはデータベースをロードしません。

于 2010-03-04T14:34:21.610 に答える