PHP全文搜索未按预期工作

时间:2015-03-06 13:53:26

标签: php mysql full-text-search full-text-indexing

我正在根据关键字用户类型查询数据,以摧毁我的数据库列。

假设用户想要搜索邮政编码和类型114,那么我们的脚本应该提供具有来自数据库zip字段的zip的结果,它们意味着模式匹配或我不确定,接下来如果用户想要查询地址和类型所需的地址,所以我们的系统应该从数据库地址字段中提供地址。

我使用的代码是:

$test       =   $_REQUEST['keyword'];

echo $query_rsTest = "SELECT zip, ste, st, st_num, town, addr, st_sfx,
MATCH (zip, ste, st, st_num, town, addr, st_sfx) against('*$test*' IN BOOLEAN MODE) as relevance
FROM
tbl_property
WHERE MATCH (zip, ste, st, st_num, town, addr, st_sfx) against('*$test*' IN BOOLEAN MODE) order by relevance desc limit 0,5";

$rsTest = mysql_query($query_rsTest) or die(mysql_error());
$row_rsTest = mysql_fetch_assoc($rsTest);

if  (isset($row_rsTest['zip'])) {?>
    <div id='fetchRecs'><ul>
    <?php
    while($row = mysql_fetch_array($rsTest)) {
        echo '<li><a href="#">'.$row['zip'].'</a></li>';
    }
    ?>
    </ul></div>
<?php } elseif (isset($row_rsTest['ste'])){?>
    <div id='fetchRecs'><ul>
    <?php
    while($row = mysql_fetch_array($rsTest)) {
        echo '<li><a href="#">'.$row['ste'].'</a></li>';
    }
    ?>
    </ul></div>
<?php }

这是我的表结构和示例记录。

enter image description here

我只是希望用户根据他在数据库中的查询获得准确的结果。意味着我们是否可以过滤数据库列,比如用户输入一些blah blah关键字,这样我们就应该匹配它并查询相应的列来查找blah blah列的结果。

感谢。

1 个答案:

答案 0 :(得分:0)

请提供SHOW CREATE TABLE tbl_property;

寻找114作为邮政编码的前缀需要以这种方式完成: WHERE zip LIKE '114%,而不是FULLTEXT。

MyISAM的FULLTEXT默认最小字大小为4(可以更改,但需要重建索引)。 InnoDB的FULLTEXT找不到任何东西,你只需要一个比它的最小尺寸短的字(默认为3)。所以,过滤掉短语。

不要在AGAINST中使用前导“*”,这不起作用。即使添加一个尾随的“*”在你的例子中也有麻烦 - 注意'* point pleasant *'的意思是“寻找以'point'结尾的单词和以'pleasant'开头的单词。再次,你需要按摩传入的查询。

建议你解析传入的查询,对用户要求的内容进行智能猜测(例如:114,本身就是一个3位数的邮编; 114加上其他东西可能是一个地址)。了解“正则表达式”,您将需要它们。