PHPを使用して全文検索機能を実装するにはどうすればよいですか?
多くの人は、ファイルの取得方法、SQL のようなステートメントの使用など、いくつかの解決策をすぐに思いつくことができるかもしれませんが、これらの方法は非常に非効率です。
ここでは、PHP の全文検索を実装するための比較的効率的な方法を紹介します。これは、MYSQL の FULLTEXT フィールド タイプを使用することです。ただし、MYSQL の FULLTEXT フィールドは中国語をあまりサポートしていません。この記事では、PHP+MYSQL を使用して中国語の全文検索機能を実装する方法も紹介します。
まず、PHP 中国語単語セグメンテーション拡張モジュール SCWS を使用する必要があります。このモジュールのインストールと使用については、www.ftphp.com/scws にアクセスして関連コンテンツを見つけることができます (メッセージを残してください)。ご質問があります)。
次に、mysql のフルテキスト フィールド タイプに関する関連情報を見てください:
MySQL バージョン 3.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 ('It appears good from here'), ('The here and the past'), ('Why are we hear'), ('An all-out alert'), ('All you need is love'), ('A good alert');
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 = trim($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 MEMBERS (メンバー) ユーザー情報全文
User_id user_id
user_nameindex_intro
User_introduction
members_index テーブルのindex_intro に FullText インデックスを追加します。
2. ユーザー情報テーブル(メンバー)のUser_introductionフィールドの内容に対して中国語単語分割処理を行います
中文分词的处理过程,可以参考简易中文分词系统http://www.ftphp.com/scws/,在城市黄页网中,我们采用了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 = trim($ss[word]); if ( $s ) $mystr .= trim($ss[word]) . " "; //echo urlencode(trim($ss[word])) . " "; } } return $mystr; }
该函数返回就是用空格连接的分词结果。
3. 对分词结果进行编码,可以采用多种编码方式,比如base64编码、urlencode编码、汉字转拼音等,对gb2312甚至可以采用区位码编码方式。考虑到存储空间以及便利性,我们采用了PHP的urlencode编码方式。需要注意的是,在编码前,我们可以去掉重复的分词来节约存储空间,编码后要去掉编码结果中的%符号,因为urlencode采用RFC 1738???行编码,会产生很多%,而%在MySQL是通配符。下面是编码过程用到的PHP代码
$data = str_fc($data); //中文分词 $data = array_filter(explode(" ",$data)); //删除数组空项 $data = array_flip(array_flip($data)); //删除重复项 //对分词结果进行urlcode编码 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即可调用用户信息表(members)中的原始数据进行显示,而没有必要进行一次解码重组。
以上MySQL UTF8中文全文检索方法.