ホームページ  >  記事  >  バックエンド開発  >  PHP+MYSQL は全文検索と全文検索ツールを実装します

PHP+MYSQL は全文検索と全文検索ツールを実装します

WBOY
WBOYオリジナル
2016-06-23 13:57:42767ブラウズ

単語分割クラス ライブラリを使用します。単語分割クラス ライブラリについては、http://www.xunsearch.com/scws/

を参照してください。

PHP を使用して全文検索機能を実装するにはどうすればよいですか?
多くの人は、ファイルの取得方法、SQL のようなステートメントの使用など、いくつかの解決策をすぐに思いつくかもしれませんが、これらの方法は非常に非効率です。
ここでは、PHP の全文検索を実装するための比較的効率的な方法を紹介します。これは、MYSQL の FULLTEXT フィールド タイプを使用することです。ただし、MYSQL の FULLTEXT フィールドは中国語をあまりサポートしていません。この記事では、PHP+MYSQL を使用して中国語の全文検索機能を実装する方法も紹介します。
まず第一に、PHP 中国語単語セグメンテーション拡張モジュール SCWS を使用する必要があります。このモジュールのインストールと使用については、www.ftphp.com/scws にアクセスして関連コンテンツを見つけることができます (メッセージを残してください)。ご質問があります)。
次に、mysql のフルテキスト フィールド タイプに関する関連情報を見てください:
MySQL3.23.23 以降のバージョンでは、フルテキスト インデックス作成と検索のサポートが開始されます。 MySQL のフルテキスト インデックスは FULLTEXT 型のインデックスです。
FULLTEXT インデックスは MyISAM テーブルで使用され、ALTER TABLE または CREATE INDEX を使用して CREATE TABLE 時またはその後に CHAR、VARCHAR、または TEXT 列に作成できます。大規模なデータベースの場合、FULLTEXT インデックスを使用せずにテーブルにデータをロードし、ALTER TABLE (または CREATE INDEX) を使用してインデックスを作成すると非常に高速になります。すでに FULLTEXT インデックスがあるテーブルにデータをロードすると、非常に時間がかかります。

MYSQL の全文検索は MATCH() 関数によって完了します。
以下に簡単な例を示します:
1. 新しいデータ テーブルを作成します:
CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;
フルテキストが追加されていない場合、ここでのコピーはフルテキスト タイプのフィールドです。テーブルの作成時に、次のようなアラートを通じて取得フィールドを追加することもできます:
ALTER TABLE fulltext_sample ADD FULLTEXT(copy)
2. データを挿入:
INSERT INTO fulltext_sample VALUES
('ここから見ると良さそうです')、
(' 「ここと過去」)、
(「なぜ聞こえるのか」)、
(「全面的な警告」)、
(「必要なのは愛だけ」)、
(「良い警告」);
3. データ取得 :
SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');
上記は mysql の全文検索関数です 注: 全文インデックスでの検索では大文字と小文字は区別されません。

中国語の全文検索を実装する方法を見てみましょう。
全文フィールドは単語に基づいており、単語はスペースで区切られる必要がありますが、中国語の文章では単語はスペースで区切られないため、上記の点を強調する必要があります。単語には中国語単語分割拡張モジュールが使用されます。
ただし、中国語の単語をセグメント化したにもかかわらず、MYSQL は MATCH による中国語の全文検索を実現できません。これには、変換に特定の方法が必要です。比較的簡単で実用的な方法は、次の関数を使用することです (もちろん、より良い方法があります)。中国語をurlencodeに変換します。
function q_encode($str)
{
$data = array_filter(explode(" ",$str));
$data = array_flip(array_flip($data));
foreach ($data as $ss) {
if (strlen($ss)>1 )
$data_code .= str_replace("%","",urlencode($ss)) . " ";
}
$data_code = トリム($data_code);
return $data_code ;
}
変換されたコンテンツを事前定義されたフルテキスト フィールドに保存します。同様に、クエリを実行する場合、クエリのキーワードも同じ方法で変換する必要があります。

PHP+Mysql で UTF8 全文検索を実装する方法

この記事では、大量のデータの全文検索をすばやく実行する方法について説明します。 MySQL は、フルテキスト インデックス機能を提供します。つまり、フィールドに FULLTEXT インデックス属性を設定し、SELECT の MATCH AGAINST ステートメントを介して検索します。

TouchUs - The Global Yellow Pages & Business Directory (www.touchus.org) は、当社が開発した純粋な英語のサイトで、MySQL のこの機能を使用して、100,000 件を超えるファイルの平均全文取得時間を 0.5 秒未満に短縮しています。データ。しかし、TouchUs の中国語 Web サイト - City Yellow Pages (www.city39.cn) を開発しているときに、新たな問題に遭遇しました。英語の植字では単語はスペースで区別され、FULLText は完全にサポートできることがわかりました。しかし、中国語や東アジアのテキストの場合はそれほど単純ではありません。中国語の単語間に明確な区切りがないため、MySQL はフルテキストをサポートできません。漢字によるテキスト検索。

MySQL で中国語の全文検索もサポートするにはどうすればよいですか?偶然思いついたアイデアは、中国語の単語を分割した後、中国語を英語の文字にエンコードして、中国語と英語の間に特定の関係を確立し、この方法で全文検索を実行することができるというものです。中国語の文字を実現することは可能ですか? 全文はインデックス化されていますか?テストした結果、答えは「はい」です。以下は、City Yellow Pages ネットワークで実装される具体的なプロセスです:

1. 別のインデックス テーブルを作成します。たとえば、 members テーブルに対応する、 members_index テーブルを作成します。

M会員(会員) ユーザー情報全文

外部インデックス。

2. ユーザー情報テーブル(メンバー)のUser_introductionフィールドの内容に対して中国語単語分割処理を実行します

中国語単語分割の処理手順については、簡易中国語単語分割システム http://www.ftphp を参照してください。 .com/scws/ (City Yellow Pages Web サイトにあります) では、scws の PHP 拡張モジュールを使用して中国語の単語のセグメンテーションを実装します。 scws PHP 拡張モジュールはインストールが非常に簡単で、コンパイルして構成するだけで使用できます。具体的な PHP コードでは、単語分割後の単語分割結果をスペースで接続する次の関数を記述しました。

//中国語単語分割関数

function str_fc($str) {

$so = scws_new();

$so->set_charset('utf8');

// set_dict および set_rule システムは次のとおりです。ここでは呼び出されません ini で指定されたパスの下にある辞書ファイルとルール ファイルの呼び出しを自動的に試みます

$so->send_text($str);

while ($tmp = $so->get_result())

{

foreach ( $tmp as $ss ){

$s = トリム($ss[単語]);

if ( $s )

$mystr .= トリム($ss[単語]) " " ;

// echo urlencode(trim($ss[word])) . " ";

}

}

return $mystr;

}

この関数は、スペースでつながれた単語の分割結果を返します。

3. 単語の分割結果をエンコードするには、base64 エンコード、urlencode エンコード、中国語文字のピンインへの変換、さらには gb2312 の位置コード エンコードなど、さまざまなエンコード方法を使用できます。保存容量と利便性を考慮して、PHPのurlencodeエンコード方式を採用しました。 urlencode は RFC 1738 行エンコードを使用するため、エンコード前に繰り返しの単語セグメントを削除してストレージ領域を節約できます。エンコード後には、エンコード結果から % 記号を削除する必要があります。 of %、および MySQL の % はワイルドカードです。以下はエンコード処理で使用される PHP コードです

​​

$data = str_fc($data); //中国語単語の分割

$data = array_filter(explode(" ",$data)); //配列

$ data = array_flip(array_flip($data)); //重複を削除

//単語分割結果を URL コード化

foreach ( $data as $ss ) {

if (strlen($ss)>) ;1 )

$data_code .= str_replace("%","",urlencode($ss)) . " ";
}


ここでの $data_code はエンコードされた結果です。エンコード結果を user_id 🎜Members_index 🎜 🎜 に基づいてユーザー情報のフルテキスト インデックスに保存します。 4. 検索処理を実行するときは、まずユーザーが入力したキーワードに対して同じ単語分割エンコードを実行し、次に MySQL の SELECT MATCH AGAINST を使用します。文は、検索結果の user_id に基づいて、デコードや再編成を行わずに、元のユーザー情報テーブル (メンバー) のデータを呼び出して表示するために使用されます。 🎜 🎜上記 MySQL UTF8 中国語全文検索方法🎜 🎜🎜 🎜 🎜🎜全文検索ツール: http://www.xunsearch.com🎜🎜 🎜 🎜 🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。