PHP+MYSQL实现全文检索_MySQL
使用分词类库,分词类库请参见: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中文全文检索方法.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











하얼빈 의과대학 임상약학 취업 전망은 어떻습니까? 전국 취업 상황이 낙관적이지는 않지만 약학 졸업생의 취업 전망은 여전히 좋습니다. 전반적으로 제약산업 졸업생의 공급은 수요보다 적다. 제약회사와 제약공장은 이러한 졸업생을 흡수하는 주요 통로이기도 하다. 보도에 따르면 최근 몇 년간 조제약품, 천연의약화학 등 전공 대학원생의 수급비율은 1:10에 달하기도 했다. 임상약학전공 취업방향: 임상의학을 전공하는 학생은 졸업 후 의료보건학과, 의학연구 및 기타 학과에서 진료, 예방, 의학연구 등에 종사할 수 있습니다. 채용 직위: 의료 담당자, 제약 영업 담당자, 영업 담당자, 영업 관리자, 지역 영업 관리자, 투자 관리자, 제품 관리자, 제품 전문가, 간호사

최근 몇몇 친구들이 win10 이미지 파일을 다운로드하는 방법을 보고했습니다. 시중에 이미지 파일이 너무 많아서 다운로드할 일반 파일을 찾으려면 어떻게 해야 하나요? 오늘은 편집자가 이미지 다운로드 링크와 자세한 해결 단계를 함께 살펴보겠습니다. win10 이미지 빠른 다운로드 및 설치 튜토리얼 다운로드 링크 >>> 시스템 홈 Ghostwin101909 이미지 64비트 버전 v2019.11<<<>>>Win10 이미지 64비트 v2019.07<<<>>>Win10 이미지 32비트 v2019. 07<< <1. 인터넷으로 검색해 보세요.

임시 폴더를 정리하는 방법 우리가 컴퓨터를 사용하면서 임시 파일(임시 파일)은 점차 쌓이게 됩니다. 이러한 임시 파일은 웹 검색 시 캐시 파일, 소프트웨어 설치 시 임시 파일 등과 같이 컴퓨터를 사용할 때 생성됩니다. 임시 폴더를 오랫동안 정리하지 않으면 많은 양의 디스크 공간을 차지하여 컴퓨터 속도에 영향을 줄 수 있습니다. 따라서 임시 폴더를 정기적으로 청소하는 것은 컴퓨터 성능을 유지하는 데 필요한 단계입니다. 아래에서는 임시 폴더를 정리하는 몇 가지 간단한 방법을 소개합니다. 방법 1: 수동으로 청소

Win10 시스템을 재설정하는 방법은 무엇입니까? 요즘에는 많은 친구들이 Win10 시스템을 사용하는 것을 좋아합니다. 그러나 컴퓨터를 사용할 때 필연적으로 해결할 수 없는 문제가 발생합니다. 그렇다면 어떻게 해야 합니까? 편집기를 따라 Win10 시스템 재설정에 대한 튜토리얼을 시청해 보세요. 필요한 사용자는 놓치지 마세요. Win10 시스템 재설정 튜토리얼 1. Windows를 클릭하고 설정을 선택합니다. 2. 업데이트 및 보안을 클릭합니다. 3. 복원을 선택합니다. 4. 이 컴퓨터를 재설정하려면 오른쪽의 시작을 클릭하세요. 위의 내용은 [Win10 시스템 재설정 방법 - Win10 시스템 재설정 튜토리얼]의 전체 내용입니다. 이 사이트에서 더 흥미로운 튜토리얼을 볼 수 있습니다!

win11 컴퓨터 구성을 확인하는 방법은 무엇입니까? win11 시스템은 매우 실용적인 컴퓨터 운영 체제 버전입니다. 이 버전은 사용자에게 더 나은 컴퓨터 작동 경험을 제공합니다. 따라서 컴퓨터를 사용하는 많은 친구들은 컴퓨터의 구체적인 구성과 이 작업을 수행하는 방법에 대해 궁금해합니다. win11 시스템에서? 많은 친구들이 자세한 작동 방법을 모릅니다. 편집자는 아래의 win11 컴퓨터 구성을 보는 방법에 대한 튜토리얼을 편집했습니다. 관심이 있으시면 편집자를 따라가십시오! Win11 컴퓨터 구성 보기 튜토리얼 1. 아래 작업 표시줄에서 Windows 아이콘을 클릭하거나 키보드의 "Windows 키"를 눌러 시작 메뉴를 엽니다. 2. 시작 메뉴에서 "설정" 또는 "sett"를 찾으세요.

시스템 재설치 시 환경 테스트가 실패하고 다시 작성해야 하는 문제를 해결하는 방법: 휴대폰이 중독되었습니다. 2. 바이러스 백신용 모바일 관리자와 같은 바이러스 백신 소프트웨어를 설치할 수 있습니다. 파일이 휴대폰 내부에 저장되어 휴대폰의 실행 메모리를 점유하게 됩니다. 3. 저장된 소프트웨어와 파일이 휴대폰 메모리를 너무 많이 차지하므로 하드웨어 구성이 설치 요구 사항을 충족하는 한 불필요한 파일과 소프트웨어를 자주 삭제하는 것은 문제가 되지 않습니다. 새 것을 시스템 디스크에서 직접 다시 설치하십시오! USB 플래시 드라이브나 하드 디스크를 사용하여 설치할 수 있으며 이는 매우 빠릅니다. 하지만 핵심은 호환성이 좋고(IDE, ACHI, RAID 모드에서 설치 지원) 자동으로 영구적으로 활성화될 수 있는 검증된 시스템 디스크를 사용하는 것입니다. 그래서

이 기사에서는 HTML에 요소의 값을 추가하는 방법을 설명합니다. 우리는 HTML의 value 속성과 그것이 사용되는 상황에 대한 기본적인 이해를 가지고 있습니다. HTMLvalue 속성을 더 잘 이해할 수 있기를 바랍니다. HTML에서 value 속성은 함께 사용되는 요소의 값을 설명하는 데 사용됩니다. 다양한 HTML 구성요소에 대해 서로 다른 의미를 갖습니다. 사용법 -,,,,,,,, 요소와 함께 사용할 수 있습니다. - value 속성이 존재하는 경우, 입력 요소의 기본값이 무엇인지 나타냅니다. 다양한 입력 유형에 대해 서로 다른 의미를 갖습니다. 버튼이 "버튼", "재설정" 및 &qu에 나타나는 경우

MySQL은 다양한 유형의 애플리케이션 개발에 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. MySQL 데이터베이스를 사용할 때 데이터베이스 보안을 강화하기 위해 비밀번호를 변경해야 하는 경우가 많습니다. 이 기사에서는 구체적인 코드 예제를 통해 MySQL 비밀번호를 변경하는 방법을 소개합니다. MySQL에서는 다음 단계에 따라 비밀번호를 변경할 수 있습니다. MySQL 데이터베이스 서버에 로그인합니다. 명령 프롬프트 또는 터미널 창을 열고 다음 명령을 실행합니다. mysql-uroo
