php - 如何进行全文搜索
问题描述
我想用 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() 。
请帮助我解决一些问题或替代路线。
解决方案
首先是全文搜索的三种类型
自然语言全文搜索
布尔全文搜索
查询扩展搜索
这里适合您的问题的是自然语言全文搜索,因为您的查询大多使用自由语言并且不使用特殊字符。语法如下
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_len
,ft_min_word_len
因此我建议
SET ft_min_word_len = 2;
在你当前的会话中尝试,有关更多信息,请参阅服务器系统变量
推荐阅读
- modelica - 如何在没有分析雅可比的情况下从 FMU 或 Dymola 访问模型雅可比
- python - Django 项目有一个内部的“lib”文件夹,它具有所有独立性。我如何使用 .bash_profile 项目链接依赖项
- python-3.x - 数据框索引无法正常工作。也不给出错误。熊猫-Python
- html - 滚动网站内容或到达特定 div 时如何更新菜单
- javascript - 如何开玩笑测试 DPI
- gradle - 如何访问阴影渐变属性
- android - 我可以在同一个 gradle 项目中拥有一个 Andoid 应用程序和一些带有共享模块的 Java11/FX 模块吗?
- android - Android KeyStore setKeyEnty 在 String.length 上抛出 NPE
- angular - 在 rxjs Angular 7 中重试后在哪里执行代码
- gitlab - GitLab FOSS 中的史诗/故事