如何进行全文搜索



我想用隐喻进行全文搜索。一切都很好。我有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((来代替((。一切都很好。但是,某些单词,如Bag、Job和Car,会被忽略为默认的最小字符4。现在的问题是,我使用共享托管,托管提供商告诉我,他不能为我提供mysql配置文件,他们也不能更改,所以在配置文件中这样做ft_min_word_len = 2不是一个选项。

//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((AGINST((。

请帮我做一些变通或替代路线的工作。

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

自然语言全文搜索
布尔全文搜索
查询扩展搜索

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

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 VARIABLESINFORMATION SCHEMA,您可以查看所有设置的变量,甚至可以在会话中使用SET更改它们,以便所有数据库连接都将基于新设置的值

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

SELECT * FROM information_schema.global_variables;这显示了当前会话中所有现有的变量,对于像flush time这样的变量,可以使用SET flush_time = 1;将其设置为1,因此现在数据库的flushtime为1,在您的情况下,我假设变量ft_max_word_lenft_min_word_len是动态可变的,因此我建议在当前会话中尝试

SET ft_min_word_len = 2;,有关更多信息,请参阅服务器系统变量

最新更新