1

値 $keywords_search で 1 つ以上のキーワードを使用する PHP/mySQL 検索関数があります。問題は、任意のキーワードに一致することです。つまり、検索を実行すると、"milk" のみを含む結果が返されるか、"milk beer" を検索すると "beer" のみが返される結果が返されます。結果に文字列内のすべてのキーワードが含まれるように変更するにはどうすればよいですか?

コードは次のとおりです。

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

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

4

2 に答える 2

1

キーワードを正規化された子テーブルに入れると、そのような検索が簡単になります。MySQL の正規表現マッチングでは、一連の代替の何個を一致させるかを指定することはできません。いずれかが一致したかどうかを示すだけです。

例えば

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

特定の ID に 3 つのキーワードがすべて存在するレコードのみが表示されます。

正規表現バージョンと正規化されていない文字列フィールドを使用すると、キーワードを複数の個別の正規表現に分割し、それらを連鎖させる必要がありますAND

例えば

SELECT ...
FROM ...
WHERE keyword REGEX ('keyword1') AND keyword REGEX ('keyword2') AND ....
于 2012-05-06T20:33:11.683 に答える
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

于 2012-05-06T20:29:10.427 に答える