首页 > 解决方案 > 如何进行全文搜索

问题描述

我想用 metaphone 进行全文搜索。一切工作正常。我有4个领域,即。

ID |Category     | Type          |Title                        |Meta
1  |Vehicle      |4 Wheelers     |Farrari Car for Sale         |FHKL WLRS FRR KR FR SL
2  |Real Estate  |Residential Apt|3BHK for sale                |RL ESTT RSTN APT BK FR SL
3  |Music        |Instruments    |Piano for sale               |MSK INST PN FR SL
4  |Stationary   |College        |Bag for $50                  |STXN KLJ BK FR
5  |Services     |Job            |Vacancy for Jr.Web Developer |SRFS JB FKNS FR JRWB TFLP

以上是样本数据。在这里,我想使用 match()against() 来使用变音位和全文搜索。一切正常。然而,像 Bag、Job 和 Car 这样的词被忽略为默认的最小字符 4。现在的问题是我使用共享主机,而主机提供商告诉我他不能为我提供 mysql 配置文件,他们也不能这样做配置文件 ft_min_word_len = 2 中的 this 不是一个选项。

//Code for generating metaphone

<?php 
    $string = "Vacancy for Jr.Web Developer";
    $a = explode(" ", $string);
    foreach ($a as $value) {
        echo metaphone($value,4)."<br>";
    }
?>

我用的是正常的

SELECT * FROM tbl_sc WHERE MATCH(META) AGAINST('$USER_SEARCH');

数据库中的所有信息都是用户生成的,因此我无法监督。由于我使用 mysql、PHP 和共享主机。我不能使用任何弹性搜索库或类似 solr 的东西。我已经搜索了谷歌和堆栈溢出但是我无法得到任何东西

一种选择是使用 LIKE 运算符,但如果可能,我想使用 MATCH() AGAINST() 。

请帮助我解决一些问题或替代路线。

标签: phpmysqlfull-text-searchmetaphone

解决方案


首先是全文搜索的三种类型

自然语言全文搜索

布尔全文搜索

查询扩展搜索

这里适合您的问题的是自然语言全文搜索,因为您的查询大多使用自由语言并且不使用特殊字符。语法如下

SELECT * FROM table_name WHERE MATCH(col1, col2)
AGAINST('search terms' IN NATURAL LANGUAGE MODE)

在您的情况下,首先将全文功能添加到您的表格中

$stmt_txt_search = $conn->prepare("ALTER TABLE tbl_sc ADD FULLTEXT (Category, Type, Title, Meta)");
$stmt_txt_search->execute();

你的查询应该是这样的

$stmt_match = $conn->prepare("SELECT * FROM tbl_sc WHERE MATCH (Meta) AGAINST(? IN NATURAL LANGUAGE MODE)");
$stmt_match->bind_param("s",$USER_SEARCH);
$stmt_match->execute();

要更改ft_min_word_len您必须转到 my.cnf 文件,将其更改为所需的值,重新启动服务器并像这样重建索引

[mysqld]
set-variable = ft_min_word_len=3

然后

mysql> ALTER TABLE tbl_sc DROP INDEX Title, Category...;
mysql> ALTER TABLE tbl_sc ADD FULLTEXT Title, Category...;

但由于您使用的是共享主机帐户,因此您无法访问该my.cnf文件。但是,您使用SHOW VARIABLES并且INFORMATION SCHEMA可以看到所有设置的变量,甚至可以SET在会话中更改它们,以便所有数据库连接都将基于新设置的值

,例如SHOW VARIABLES在 sql 中,您可以使用

SELECT * FROM information_schema.global_variables; 它显示当前会话中的所有现有变量,对于像flush time它这样的变量可以设置为1使用SET flush_time = 1;,所以现在数据库的刷新时间将从 1 开始,在你的情况下,我认为变量是动态可变的ft_max_word_lenft_min_word_len因此我建议

SET ft_min_word_len = 2;在你当前的会话中尝试,有关更多信息,请参阅服务器系统变量


推荐阅读