我的数据库中有一个名为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);
然后我尝试做一些测试,看看我会得到什么结果:
$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表创建索引,其中包括产品标题,描述和元数据。
我看到它的方式我有两个选择:
无论哪种方式,我们可能会处理糟糕的谷歌翻译。
尝试删除你周围的'
?
$params = ['%'.$term.'%'];
$sql = "SELECT * FROM pro_search WHERE $lang LIKE ?;";
$stmt = DB::run($sql,$params);
$count = $stmt->rowCount();
echo $count.'<br />';
在第一个语句中,您添加的字符串参数没有任何引号:$lang=?
。这意味着你不需要围绕?
的单引号用于其他陈述;
只有第一个查询没有引号。
所以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 />';
我假设DB::run($sql,$params);
在字符串中添加引号?如果是这样,它会创建
WHERE en LIKE '"stuff"'
删除你的报价。