Heim  >  Artikel  >  Backend-Entwicklung  >  PHP MYSQL implementiert die Volltextsuche und Volltextsuchtools

PHP MYSQL implementiert die Volltextsuche und Volltextsuchtools

巴扎黑
巴扎黑Original
2018-05-26 16:47:4913330Durchsuche

Wie verwende ich PHP, um die Volltextsuchfunktion zu implementieren?
Viele Leute können vielleicht sofort mehrere Lösungen finden, wie zum Beispiel: Dateiabrufmethode, Verwendung einer SQL-ähnlichen Anweisung usw., aber diese Methoden sind ziemlich ineffizient.
Hier stellen wir eine relativ effiziente Methode zur Implementierung des PHP-Volltextabrufs vor, nämlich die Verwendung des FULLTEXT-Feldtyps von MYSQL. Allerdings unterstützt das FULLTEXT-Feld von MYSQL Chinesisch nicht sehr gut. In diesem Artikel wird auch beschrieben, wie die chinesische Volltextsuchfunktion über PHP MYSQL implementiert wird.
Zunächst müssen Sie ein PHP-Erweiterungsmodul für die chinesische Wortsegmentierung verwenden? SCWS Informationen zur Installation und Verwendung dieses Moduls finden Sie unter www.ftphp.com/scws (bitte hinterlassen Sie eine Seite). Nachricht, wenn Sie Fragen haben).
Dann werfen Sie einen Blick auf die relevanten Informationen zum Volltextfeldtyp von MySQL:
MySQL-Versionen nach 3.23.23 beginnen, die Volltextindizierung und -suche zu unterstützen. Der Volltextindex in MySQL ist ein Index vom Typ FULLTEXT.
FULLTEXT-Indizes werden für MyISAM-Tabellen verwendet und können für CHAR-, VARCHAR- oder TEXT-Spalten bei oder nach CREATE TABLE mit ALTER TABLE oder CREATE INDEX erstellt werden. Bei großen Datenbanken ist es sehr schnell, die Daten in eine Tabelle ohne FULLTEXT-Index zu laden und dann mit ALTER TABLE (oder CREATE INDEX) den Index zu erstellen. Das Laden von Daten in eine Tabelle, die bereits über einen FULLTEXT-Index verfügt, ist sehr langsam.

Die MYSQL-Volltextsuche wird über die Funktion MATCH() abgeschlossen.
Das Folgende ist ein einfaches Beispiel:
1. Erstellen Sie eine neue Datentabelle:

CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM;

Die Kopie hier ist ein Feld vom Typ Volltext Beim Erstellen der Tabelle hinzugefügt, kann auch über eine Warnung hinzugefügt werden, z. B.:

ALTER TABLE fulltext_sample ADD FULLTEXT(copy)

2. Daten einfügen:

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. Datenabruf:

SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');

Das Obige ist die Volltextsuchfunktion von MySQL. Hinweis: Bei der Suche im Volltextindex wird die Groß-/Kleinschreibung nicht beachtet.

Sehen wir uns an, wie man die chinesische Volltextsuche implementiert.
Das Volltextfeld basiert auf Wörtern, und Wörter müssen durch Leerzeichen getrennt werden. In chinesischen Sätzen werden Wörter jedoch nicht durch Leerzeichen getrennt, daher müssen wir chinesische Wörter segmentieren, weshalb das Obige erforderlich ist Wörter verwenden Sie das Erweiterungsmodul für die chinesische Wortsegmentierung.
Trotz der Segmentierung chinesischer Wörter kann MYSQL jedoch immer noch keinen Volltextabruf von Chinesisch über MATCH erreichen. Dies erfordert die Konvertierung einer bestimmten Methode. Eine relativ einfache und praktische Methode ist die Verwendung der folgenden Funktion (natürlich gibt es bessere). ones ), das Chinesisch in URL-Code umwandelt.

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;
}

Speichern Sie den konvertierten Inhalt im vordefinierten Volltextfeld. Ebenso müssen bei der Abfrage die Abfrageschlüsselwörter auf die gleiche Weise konvertiert werden.

Wie implementiert man die UTF8-Volltextsuche in PHP Mysql

In diesem Artikel wird erklärt, wie man schnell eine Volltextsuche in großen Datenmengen durchführt? MySQL bietet eine Volltextindexfunktion, das heißt, das FULLTEXT-Indexattribut für das Feld festzulegen und dann die MATCH AGAINST-Anweisung von SELECT zu durchsuchen.

Eine von uns entwickelte rein englische Website TouchUs – The Global Yellow Pages & Business Directory (www.touchus.org) nutzt diese Funktion von MySQL, um eine durchschnittliche Volltext-Abrufzeit für mehr als 100.000 Daten zu erreichen. Weniger als 0,5 Sekunden. Bei der Entwicklung der chinesischen Website von TouchUs – City Yellow Pages (www.city39.cn) stießen wir jedoch auf neue Probleme. Es stellt sich heraus, dass im englischen Schriftsatz Wörter durch Leerzeichen unterschieden werden, was FULLText jedoch vollständig unterstützen kann. Bei chinesischen oder ostasiatischen Texten ist dies jedoch nicht so einfach, da es keine offensichtliche Trennung zwischen chinesischen Wörtern gibt und MySQL daher keine vollständige Unterstützung bietet. Textsuche mit chinesischen Schriftzeichen.

Wie kann MySQL auch die chinesische Volltextsuche unterstützen? Durch Zufall entstand die Idee, dass es nach der Segmentierung chinesischer Wörter möglich sei, chinesische Zeichen in englische Zeichen zu kodieren, um so eine spezifische Verbindung zwischen Chinesisch und Englisch herzustellen und dann eine Volltextsuche durchzuführen Können chinesische Schriftzeichen nicht erkannt werden? Ist der Volltext indiziert? Nach dem Test lautet die Antwort ja. Das Folgende ist der spezifische Prozess, der im City Yellow Pages-Netzwerk implementiert ist:

1 Erstellen Sie eine separate Indextabelle, z. B. entsprechend der Mitgliedertabelle, wir erstellen eine Mitgliederindextabelle.

Benutzerinformationstabelle (Mitglieder) Benutzerinformations-Volltextindextabelle (members_index)

Benutzer-ID Benutzer-ID

Benutzername Volltextindex zu index_intro der Mitgliederindextabelle hinzufügen.

2. Führen Sie eine chinesische Wortsegmentierungsverarbeitung für den Inhalt des Feldes „User_introduction“ der Benutzerinformationstabelle (Mitglieder) durch

中文分词的处理过程,可以参考简易中文分词系统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中文全文检索方法.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn