PHP / SQL - 使用`LIKE`和`MATCH AGAINST`搜索数据库

问题描述 投票:1回答:3

我的数据库中有一个名为pro_search的表,我在其中翻译了不同语言的不同产品的元信息。

我的表结构如下:id pro_id en de es fr it nl pl pt其中pro_id是产品的id,其他列中的双字母代码表示该产品元数据的翻译语言。

我运行以下代码在我的数据库上创建一个FULLTEXT索引:

ALTER TABLE pro_search ADD FULLTEXT INDEX `FullText` (`en` ASC, `de` ASC, `es` ASC, `fr` ASC, `it` ASC, `nl` ASC, `pl` ASC, `pt` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `enFullText` (`en` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `deFullText` (`de` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `esFullText` (`es` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `frFullText` (`fr` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `itFullText` (`it` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `nlFullText` (`nl` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `plFullText` (`pl` ASC);
ALTER TABLE pro_search ADD FULLTEXT INDEX `ptFullText` (`pt` ASC);

enter image description here

然后我尝试做一些测试,看看我会得到什么结果:

$lang = 'en';
$term = 'this is a test';

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE $lang=?;";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '1' so there is definitely a match

$params = ['%'.$term.'%'];
$sql = "SELECT * FROM pro_search WHERE $lang LIKE '?';";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '0'

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST ('?');";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '0'

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST ('?' IN NATURAL LANGUAGE MODE);";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '0'

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST ('?' WITH QUERY EXPANSION);";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '0'

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST ('?' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
// returns '0'

你可以看到第一个确切的查询返回一个结果,如果我直接在SELECT * FROM pro_search WHERE en LIKE '%test%'的phpMyAdmin中进行查询,我得到7个总结果,但在我的第二个查询中没有在我的php文件中完全相同。

我在这里错过了什么吗?我认为所有这些应该至少返回一个结果,如果不是更多。

// - - -编辑 - - -//

这是我的表格的创建代码,以防它有助于:

CREATE TABLE `pro_search` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `pro_id` int(11) NOT NULL,
 `en` varchar(255) DEFAULT NULL,
 `de` varchar(255) DEFAULT NULL,
 `es` varchar(255) DEFAULT NULL,
 `fr` varchar(255) DEFAULT NULL,
 `it` varchar(255) DEFAULT NULL,
 `nl` varchar(255) DEFAULT NULL,
 `pl` varchar(255) DEFAULT NULL,
 `pt` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 FULLTEXT KEY `FullText` (`en`,`de`,`es`,`fr`,`it`,`nl`,`pl`,`pt`),
 FULLTEXT KEY `enFullText` (`en`),
 FULLTEXT KEY `deFullText` (`de`),
 FULLTEXT KEY `esFullText` (`es`),
 FULLTEXT KEY `frFullText` (`fr`),
 FULLTEXT KEY `itFullText` (`it`),
 FULLTEXT KEY `nlFullText` (`nl`),
 FULLTEXT KEY `plFullText` (`pl`),
 FULLTEXT KEY `ptFullText` (`pt`)
) ENGINE=MyISAM AUTO_INCREMENT=1597 DEFAULT CHARSET=latin1

此外,人们会如何推荐使用多种语言进行搜索?我通过这种方式设置产品元素被翻译,但我们没有翻译,因此其中一些是直接来自谷歌翻译,只是在这里和那里做了一些改变。但是,如果我开始工作,我可能会尝试直接从products表创建索引,其中包括产品标题,描述和元数据。

我看到它的方式我有两个选择:

  1. 存储产品翻译并搜索这些,或
  2. 翻译搜索词并用英语搜索

无论哪种方式,我们可能会处理糟糕的谷歌翻译。

php mysql sql full-text-search
3个回答
1
投票

尝试删除你周围的'

  $params = ['%'.$term.'%'];
  $sql = "SELECT * FROM pro_search WHERE $lang LIKE ?;";
  $stmt = DB::run($sql,$params);
  $count = $stmt->rowCount();
  echo $count.'<br />';

在第一个语句中,您添加的字符串参数没有任何引号:$lang=?。这意味着你不需要围绕?的单引号用于其他陈述;


1
投票

只有第一个查询没有引号。

所以DB :: run正在添加引号。

从所有MATCH ... AGAINST查询中删除引号。

这样他们应该全部工作。

编辑:试试这个

$params = [$term];
$sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST (?);";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';

0
投票

我假设DB::run($sql,$params);在字符串中添加引号?如果是这样,它会创建

WHERE en LIKE '"stuff"'

删除你的报价。

© www.soinside.com 2019 - 2024. All rights reserved.