PHP+MYSQL实现全文检索_MySQL

Jun 01, 2016 pm 01:16 PM
どうやって

使用分词类库,分词类库请参见:http://www.xunsearch.com/scws/

如何使用PHP实现全文检索功能?
很多人可能马上可以想出几种方案,比如:文件检索法、采用SQL的like语句等方法,但这些方法效率都相当的低。
这里介绍一种比较高效的PHP全文检索实现方法,这就是采用MYSQL的FULLTEXT字段类型。但是MYSQL的FULLTEXT字段对中文的支持不是很好,本文也一并介绍如何通过PHP+MYSQL实现中文全文检索功能。
首先需要用到一个PHP中文分词扩展模块——SCWS,关于这个模块的安装和使用大家可以到www.ftphp.com/scws去查找相关内容(如有问题请留言)。
然后再看看mysql的fulltext字段类型的相关信息:
MySQL3.23.23之后的版本开始支持全文索引和搜索。全文索引在 MySQL 中是一个 FULLTEXT 类型索引。
FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。

MYSQL全文搜索通过 MATCH() 函数完成。
下面举一简单例子:
1、新建数据表:
CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;
这里的copy就是一个fulltext类型的字段,如果建表的时候没有添加全文检索字段,也可以通过alert来添加,如:
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的全文检索功能,注意:在全文索引上进行搜索是不区分大小写的。

下面再看如何实现中文全文检索。
fulltext字段是以词语为单位,词语之间需要用空格隔开,而汉语的句子中各个词语之间并不会用空格隔开,因此我们需要对中文进行分词,这也就是为什么上面需要强词用到中文分词扩展模块。
但是尽管对中文进行分词,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;
}
将转换过后的内容保存至事先定义好的fulltext字段。同样,在查询的时候也需要将查询的关键词进行同样方法的转换。

PHP+Mysql实现UTF8全文搜索的方法

本文讲解一下如何在海量的数据中能够快速的进行全文检索呢?MySQL提供了一个全文索引功能,也就是把字段设置上FULLTEXT索引属性,然后通过SELECT的MATCH AGAINST语句进行查找。

我们开发的一个纯英文站点TouchUs - The Global Yellow Pages & Business Directory(www.touchus.org)就是利用MySQL的这一功能,实现了对十多万条数据的平均全文检索时间小于0.5秒。但是在开发TouchUs的中文网站——城市黄页网时(www.city39.cn),碰到了新的问题。原来英文排版时词和词之间是通过空格区分的,FULLText可以完全支持,但是对中文或者是东亚文字就没有这么简单了,因为中文的词和词之间并没有明显的分隔,所以MySQL不支持中文字符的全文检索。

如何让MySQL也能支持中文的全文检索呢?偶然间产生了一个思路,那就是能不能在中文分词后,通过对中文进行编码转化成英文字符,这样就在中英文间建立一个特定的联系,然后再进行全文检索,这样不就实现了中文的全文索引了吗?经过试验,答案是肯定的。下面是在城市黄页网中实现的具体过程:

1. 建立一个单独的索引表,比如对应members表,我们建立一个members_index表。

用户信息表(members)                    用户信息全文索引表(members_index)

User_id                                              user_id

User_name                                       index_intro

User_introduction                                   

在members_index表的index_intro中加入fulltext索引。

2. 对用户信息表(members)的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中文全文检索方法.

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ハルビン医科大学の臨床薬学への就職に将来はありますか? (ハルビン医科大学の臨床薬学への就職の見通しはどのようなものですか?) ハルビン医科大学の臨床薬学への就職に将来はありますか? (ハルビン医科大学の臨床薬学への就職の見通しはどのようなものですか?) Jan 02, 2024 pm 08:54 PM

ハルビン医科大学の臨床薬学の就職の見通しはどのようなものですか? 全国の雇用情勢は楽観的ではありませんが、薬学部卒業生の就職の見通しは依然として良好です。全体として、薬学部卒業生の供給は需要を下回っており、製薬会社や製薬工場がその卒業生を吸収する主なチャネルとなっており、製薬業界における人材需要も着実に伸びています。報道によると、近年、医薬品製剤や生薬化学などの専攻の大学院生の需給比は1:10に達するケースもあるという。臨床薬学専攻の就職方向:臨床医学専攻の学生は卒業後、医療保健ユニット、医学研究部門等で治療、予防、医学研究等に従事することができます。雇用職種:医薬情報担当者、医薬品営業担当者、営業担当者、営業マネージャー、地域営業マネージャー、投資マネージャー、プロダクトマネージャー、プロダクトスペシャリスト、看護師

win10イメージを素早くダウンロードする方法 win10イメージを素早くダウンロードする方法 Jan 07, 2024 am 11:33 AM

最近、何人かの友人が win10 イメージ ファイルをダウンロードする方法を報告しました。市場には非常に多くのイメージ ファイルがあるため、ダウンロードする通常のファイルを見つけたい場合はどうすればよいですか?本日、編集者が画像をダウンロードするためのリンクと詳細な解決手順を提供しましたので、一緒に見てみましょう。 win10 イメージのクイック ダウンロードとインストール チュートリアル ダウンロード リンク >>> システム ホーム Ghostwin101909 イメージ 64 ビット バージョン v2019.11<<<>>>Win10 イメージ 64 ビット v2019.07<<<>>>Win10 イメージ 32 ビット v2019。 07<< <1. インターネットで検索する

一時フォルダーをクリーンアップする方法 一時フォルダーをクリーンアップする方法 Feb 22, 2024 am 09:15 AM

一時フォルダーをクリーンアップする方法 コンピューターを使用していると、一時ファイル (一時ファイル) が徐々に蓄積されていきます。これらの一時ファイルは、Web 閲覧時のキャッシュ ファイル、ソフトウェアのインストール時の一時ファイルなど、コンピューターを使用するときに生成されます。一時フォルダーを長期間クリーンアップしないと、大量のディスク領域が占有され、コンピューターの速度に影響が出る可能性があります。したがって、一時フォルダーを定期的にクリーニングすることは、コンピューターのパフォーマンスを維持するために必要な手順です。以下に、一時フォルダーをクリーンアップする簡単な方法をいくつか紹介します。方法 1: 手動でクリーニングします。

Win10システムをリセットする方法 Win10システムをリセットする方法 Jun 29, 2023 pm 03:14 PM

Win10システムをリセットするにはどうすればよいですか?最近、多くの友人が Win10 システムを搭載したコンピュータを使用することを好みますが、コンピュータを使用していると必ず解決できない問題が発生します。このとき、システムをリセットすることができます。エディターに従って、Win10 システムのリセットに関するチュートリアルを見てみましょう。必要なユーザーは見逃さないでください。 Win10 システムのリセットに関するチュートリアル 1. [Windows] をクリックし、[設定] を選択します。 2. 「更新とセキュリティ」をクリックします。 3. 「復元」を選択します。 4. 右側の「開始」をクリックして、このコンピュータをリセットします。上記は、[Win10 システムをリセットする方法 - Win10 システムをリセットするチュートリアル] の全内容ですが、このサイトにはさらに興味深いチュートリアルが用意されています。

win11コンピュータの構成を確認する方法 win11コンピュータの構成を確認する方法 Jun 29, 2023 pm 12:15 PM

win11コンピュータの構成を確認するにはどうすればよいですか? win11 システムは非常に実用的なコンピュータ オペレーティング システムのバージョンです。このバージョンではユーザーに豊富な機能が提供され、ユーザーはより良いコンピュータ操作体験を得ることができます。コンピュータを使用する多くの友人が自分のコンピュータに興味を持っています。具体的な構成、この操作の実行方法win11システムでは?詳細な操作方法を知らない友人も多いと思いますが、Win11 コンピュータの構成を表示する方法についてはエディターが以下にまとめていますので、興味がある方はエディターをフォローして読み進めてください。 Win11 コンピューター構成ビューのチュートリアル 1. 下のタスクバーの Windows アイコンをクリックするか、キーボードの「Windows キー」を押して、スタート メニューを開きます。 2. スタートメニューで「設定」または「sett」を見つけます。

システムの再インストール時の環境検出の問題を解決する システムの再インストール時の環境検出の問題を解決する Jan 08, 2024 pm 03:33 PM

システム再インストール時に環境テストに失敗し、書き換えが必要になる場合の解決方法:携帯電話が汚染されているため、ウイルス対策として Mobile Manager などのウイルス対策ソフトをインストールしてください 2. ジャンクが多いファイルは携帯電話内に保存されるため、携帯電話の実行メモリが占​​有されます。この問題を解決するには、電話機のキャッシュをクリアするだけです。3. 保存されたソフトウェアやファイルによって電話機のメモリが占​​有されすぎています。不要なファイルやソフトウェアを頻繁に削除しても問題ありません。ハードウェア構成がインストール要件を満たしている限り、次のことが可能です。新しいものを直接使用してください。システム ディスクからシステムを再インストールしてください。 USB フラッシュ ドライブまたはハードディスクを使用してインストールでき、非常に高速です。ただし、重要なのは、互換性の良いシステム ディスク (IDE、ACHI、および RAID モードでのインストールをサポート) を使用することであり、自動的かつ永続的にアクティブ化できることが検証されています。それで

HTML要素の値を追加するにはどうすればよいですか? HTML要素の値を追加するにはどうすればよいですか? Sep 16, 2023 am 08:41 AM

この記事では、HTML に要素の値を追加する方法を説明します。 HTML の value 属性とそれが使用される状況についての基本を理解しています。 HTMLvalue 属性についての理解を深めていきましょう。 HTML では、value 属性は、一緒に使用される要素の値を記述するために使用されます。これは、さまざまな HTML コンポーネントに対して異なる意味を持ちます。使用法 - 、、、、、、、要素とともに使用できます。 - value 属性が存在する場合、input 要素のデフォルト値が何であるかを示します。入力の種類ごとに意味が異なります。ボタンが「ボタン」、「リセット」、および「&qu」に表示される場合。

mysqlでパスワードをリセットする方法 mysqlでパスワードをリセットする方法 Feb 18, 2024 pm 12:41 PM

MySQL は、さまざまな種類のアプリケーション開発で広く使用されているオープンソースのリレーショナル データベース管理システムです。 MySQL データベースを使用する場合、データベースのセキュリティを向上させるためにパスワードの変更が必要になることがよくあります。この記事では、MySQL パスワードを変更する方法を具体的なコード例を通して紹介します。 MySQL では、次の手順に従ってパスワードを変更できます。 MySQL データベース サーバーにログインします。 コマンド プロンプトまたはターミナル ウィンドウを開いて、次のコマンドを実行します: mysql-uroo

See all articles