0

現在、データベース内のフィールドで 1 つの単語の言及を検索する次のものがありますが、顧客が 2 つの単語を入力した場合、その特定の形式に一致するものだけを出力するのではなく、実際に分割される可能性があるかどうかを知りたいです。完全一致ではない両方の単語の結果を返します。

現在持っている

   WHERE title LIKE '%SEARCH TEXT HERE%'..

そのため、ユーザーが現在「FISH」または「FISH FOOD」と入力すると、そのテキストが含まれている列のみがそのまま返されます。

私が望んでいるのは、彼らが複数の単語を入力した場合、実際にそれを分割し、すべての個別の単語の結果を検索して返すことです。

したがって、'FISH FOOD' は、'FISH FOOD' に一致するものだけでなく、単語 fish または food を含むすべての行を返します。

PHP と MySQL の使用

ありがとう

4

4 に答える 4

2

キーワードの文字列を分割して、次のようにクエリを実行する必要があります。

WHERE title LIKE '%SEARCH%' OR title LIKE '%TEXT%' OR title LIKE '%HERE%'..

より複雑ではありますが、Full Text の学習曲線に達している場合は、bpgergo の回答に同意します。単純な「LIKE」クエリに比べて多くの利点があります。このことを考慮:

SELECT * FROM article WHERE title like '%BIO%'

これは、「BIOLOGY」、「BIOgraphy」などを含むものをすべて返します。フル テキストは単語の境界を理解するため、これらの「課題」はアドレスです。また、一致する関連性を使用して、結果を並べ替えるときにそれを使用することもできます。

また、"stop" 単語も考慮されるため、ユーザーが "Food for my fish" を入力した場合、"for" と "my" は省略される一般的な単語であるため、"Food" と "Fish" にのみ一致します。

于 2012-05-25T16:04:02.800 に答える
1

検索文字列を部分に分割します (explode(" ", $string))。次に、各パーツに条件のタイトル LIKE "%$part%' OR title LIKE "%$part%' OR ... を追加します。

于 2012-05-25T16:03:31.173 に答える
1

@Greg P、@ErikFWinter、@bpgergo の返信に感謝します。

  $search = explode(' ', $title);
    $searchResults = 'LIKE ';
    foreach ($search as $id => $word) {
        $searchResults .= "'%" . $word . "%'";
        $searchResults .= " OR title LIKE ";
    }
    $searchResults = rtrim($searchResults," OR title LIKE ");

    return $this->db->select("SELECT videoid, title, formatloc FROM db_vList WHERE title {$searchResults} order by title asc");

もっと簡単な理由があるかもしれませんが、学習は非常に高く評価されています。

于 2012-05-25T16:43:18.287 に答える
0

必要なのは、MySQL の FULLTEXT インデックスです。

これは、探していることだけを行う詳細な例です。

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

EDITこれは純粋なSQLソリューションです。

SO の便宜上、関連する SQL をここにコピーしました。

CREATE TABLE articles (
d INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
ENGINE=MyISAM;

INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');

SELECT id, body, MATCH (title,body) AGAINST
('Security implications of running MySQL as root') AS score
FROM articles WHERE MATCH (title,body) AGAINST
('Security implications of running MySQL as root');
于 2012-05-25T16:06:38.123 に答える