Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL中使用'LIKE'和'MATCH-on'搜索数据库_Php_Mysql_Sql_Full Text Search - Fatal编程技术网

Php 在MySQL中使用'LIKE'和'MATCH-on'搜索数据库

Php 在MySQL中使用'LIKE'和'MATCH-on'搜索数据库,php,mysql,sql,full-text-search,Php,Mysql,Sql,Full Text Search,在我的数据库中有一个名为pro_search的表,我用不同的语言翻译了不同产品的元信息 我的表结构如下:id pro_id en de es fr it nl pl pt 其中,pro_id是产品的id,其他列中的两个字母代码表示该产品元数据的翻译语言 我运行以下代码在数据库上创建全文索引: ALTER TABLE pro_search ADD FULLTEXT INDEX `FullText` (`en` ASC, `de` ASC, `es` ASC, `fr` ASC, `it` ASC,

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

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

我运行以下代码在数据库上创建全文索引:

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'
另外,人们会如何推荐使用多种语言进行搜索?我是这样设置的,产品元是翻译的,但我们没有翻译,所以其中一些是直接从谷歌翻译,只是在这里和那里的一些变化。然而,如果我能做到这一点,我可能会尝试直接从products表创建一个索引,其中包括产品标题、描述和元数据

在我看来,我有两个选择:

  • 存储产品翻译并搜索这些翻译,或
  • 翻译搜索词并用英语搜索
  • 无论哪种方式,我们都可能要处理糟糕的谷歌翻译。

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

    WHERE en LIKE '"stuff"'
    

    删除你的引号。

    试着删除你周围的

      $params = ['%'.$term.'%'];
      $sql = "SELECT * FROM pro_search WHERE $lang LIKE ?;";
      $stmt = DB::run($sql,$params);
      $count = $stmt->rowCount();
      echo $count.'<br />';
    
    $params=['%.$term.'%'];
    $sql=“从pro_搜索中选择*,其中$lang LIKE?;”;
    $stmt=DB::run($sql,$params);
    $count=$stmt->rowCount();
    回显$count。“
    ”;

    在第一条语句中,您添加的字符串参数没有任何引号:
    $lang=?
    。这意味着您不需要在其他语句的
    周围加上单引号

    只有第一个查询没有引号

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

    从所有匹配中删除引号。。。反对质疑

    这样,他们应该工作的所有

    编辑: 试试这个

    $params=[$term];
    $sql=“从pro_搜索中选择*匹配($lang)与(?);”;
    $stmt=DB::run($sql,$params);
    $count=$stmt->rowCount();
    回显$count。“
    ”;
    屏幕截图是phpmyadmin,所以我猜MySQL@jarlh是的,MySQL和phpMyAdmin从设计的角度来看,最好只有一个文本列和另一个语言代码。这将节省这么多索引,还意味着您可以随时轻松添加新语言。@NigelRen是的,我可能会改变这一点。我以前对它进行了不同的设置(请参阅),现在正在测试不同的选项,但现在正努力让它返回任何东西。您的测试中有多少行?每个元列中的典型字数是多少?这不是问题所在。在变量周围添加实际引号会导致SQL错误。这实际上给了我一个结果,即使结果是“0”,而不是我原来的结果expecting@PaddyHallihan-我很困惑--代码要求的唯一结果是$count,由于伪引号,它将是0。如果您也遇到了错误,那么该错误的全文是什么?
      $params = ['%'.$term.'%'];
      $sql = "SELECT * FROM pro_search WHERE $lang LIKE ?;";
      $stmt = DB::run($sql,$params);
      $count = $stmt->rowCount();
      echo $count.'<br />';
    
    $params = [$term];
    $sql = "SELECT * FROM pro_search WHERE MATCH ($lang) AGAINST (?);";
    $stmt = DB::run($sql,$params);
    $count = $stmt->rowCount();
    echo $count.'<br />';