1

私は次のクエリを持っています

SELECT * 
FROM  `articles` 
WHERE (
        (
        UCASE(  `title` ) LIKE UCASE(  '% Fishoil %' ) 
        AND UCASE(  `title` ) LIKE UCASE(  '% for %' ) 
        AND UCASE(  `title` ) LIKE UCASE(  '% more %' ) 
        AND UCASE(  `title` ) LIKE UCASE(  '% musclemass %' )
        )
    OR (
        UCASE(  `text` ) LIKE UCASE(  '% Fishoil %' ) 
        AND UCASE(  `text` ) LIKE UCASE(  '% for %' ) 
        AND UCASE(  `text` ) LIKE UCASE(  '% more %' ) 
        AND UCASE(  `text` ) LIKE UCASE(  '% musclemass %' )
        )
    OR (
        UCASE(  `source` ) LIKE UCASE(  '% Fishoil %' ) 
        AND UCASE(  `source` ) LIKE UCASE(  '% for %' ) 
        AND UCASE(  `source` ) LIKE UCASE(  '% more %' ) 
        AND UCASE(  `source` ) LIKE UCASE(  '% musclemass %' )
        )
    OR (
        UCASE(  `unique` ) LIKE UCASE(  '% Fishoil %' ) 
        AND UCASE(  `unique` ) LIKE UCASE(  '% for %' ) 
        AND UCASE(  `unique` ) LIKE UCASE(  '% more %' ) 
        AND UCASE(  `unique` ) LIKE UCASE(  '% musclemass %' )
        )
    )
ORDER BY  `year` DESC

私がやりたいのは変化です

UCASE(  `tile` ) LIKE UCASE(  '% Fishoil %' )

の中へ

 UCASE(  `title` ) LIKE UCASE(  '%Fishoil %' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil,%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil.%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil:%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil;%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil\'%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil"%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil!%' ) 
OR 
    UCASE(  `title` ) LIKE UCASE(  '%Fishoil?%' )

しかし、これは、照合を数回行う必要があるため、クエリを不必要に複雑にするように思われます。「検索語+特殊文字」と一度に一致するような正規表現の一致はありますか?

もしそうなら、それと一致するための最良の方法は何でしょうか?

これは、キーワード検索文字列を生成するためのphpコードです。

$specialchars = array(' ',',','.',':',';',mysql_real_escape_string("'"),'"','!','?');
foreach($seek as $searchword)
    {
    foreach($specialchars as $char)
        {
        $seeker[] = "LIKE UCASE(  '%$searchword".$char."%' )";
        }
    $temp = implode(" OR ",$seeker);
    echo $temp;
    }
4

3 に答える 3

2

ワイルドカード構文よりも強力な正規表現を使用することをお勧めします。正規表現を使用すると、一連の条件全体を 1 回の呼び出し (列ごと)LIKEに合わせることができます。REGEXP

于 2012-09-19T11:34:04.907 に答える
1

各文字に or 句を追加する代わりに、アンダースコア ( _) を使用します。これはワイルドカードのように機能しますが、1 つのことを除いては、単一の文字のプレースホルダーです。

SELECT * FROM foo WHERE bar LIKE 'visolie_';

visolie!、visolie:、visolie?、および -like は大文字と小文字を区別しないViSOliE! にも一致します。

編集:

すべての意図と目的に対して:非常に巧妙な人々によって作成された多くの優れた検索エンジンがあり、有能なプログラマーの軍隊によってさらに開発されています。独自の SE を作成しようとするのは良い練習になるかもしれませんが、実際にはCSEを使用してください。
彼らはあなたのために大変な仕事をしてくれました。開発者であるということは、賢い方法で怠け者であることを意味します。オープンソース ソフトウェア、つまり Web の本質は、常に車輪を再発明する必要を回避することです。

どうしても独自の SE を構築したい場合、PHP と MySQL は実績のあるテクノロジですが、その作業に最適なツールではない可能性があります。より高速な DB (NoSQL?) の代替案を検討してみてください (MongoDB が思い浮かびます。データを常に更新するつもりがない限り、非常に高速です。繰り返しますが、1 つを選択すると、もう 1 つを失うことになり、データはそれほど安全ではありません。保存されています...)。
PHP はかなり高速ですが、たとえば C++ に比べて多くのリソースを消費します。これが正しいかどうかはわかりませんが、SE は google, yahoo! のようなものだと言って、かなりの金額を賭ける用意があります。粗末な古い Bing でさえ、どこかに非常に重い C(++) コードベースを持っています。現在のところ、これを超えるスクリプト言語はありません (IMO には、それを超えるスクリプト言語はありません)。

于 2012-09-19T11:35:39.287 に答える
0

全文を見る価値があるかもしれません

あなたはこのようなことをすることができます。

SELECT *, MATCH(title,text,source,unique) AGAINST('fishoil for more musclemass') AS `score` FROM `articles` WHERE MATCH(title,text,source,unique) AGAINST('fishoil for more musclemass') ORDER BY `score` DESC, `year` DESC

whcihは、最も関連性の高い結果を最初に返します。

SQLテーブルも変更する必要があります。

ALTER TABLE articles ADD FULLTEXT(title,text,source,unique);

お役に立てれば

于 2012-09-19T11:43:29.743 に答える