0

场景:我正在使用此查询在特定类别中的两列 ProductName 和 Description 上搜索 MySql 表:

$query = "SELECT * FROM Products WHERE MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category_description='".$search_dept."' OR MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category2='".$search_dept."' ORDER BY $orderby LIMIT $offset, $rowsPerPage";

搜索条件 $terms[x] 来自表单中的文本输入字段,并使用以下格式设置:

$slash_term = addslashes($_POST['term']);
$var = @$slash_term;
$trimmed = trim($var);
$terms = explode(' ',$trimmed);

该例程运行良好,直到您使用停用词,然后显然查询被终止。

我在共享服务器上,无法禁用停用词检查。因此,根据我一直在研究的内容,可以使用 LIKE 和 % 通配符来解决这个问题。

那么如何将上述查询转换为 LIKE 查询,我认为它类似于以下内容,但它不起作用。

    $query = "select * from Products where category_description='".$search_dept."' AND Description like \"%$trimmed%\" OR category_description='".$search_dept."' AND ProductName like \"%$trimmed%\" ORDER BY $orderby LIMIT $offset, $rowsPerPage";

我是否会通过仅使用 %$trimmed% 从搜索短语中获取通配符的每个单词?还是我应该这样做?搜索几乎总是包含多个单词。

由于第一个查询似乎几乎完美无缺,我是否值得只添加一个子程序来检查用户输入的停用词并在搜索之前将它们从短语中删除?

4

1 回答 1

1

好的,这是我的解决方案。我检查并从用户输入中删除任何停用词,然后继续执行原始搜索查询。完美运行。

// format user's input
$slash_term = addslashes($_POST['term']);
$var = @$slash_term;
$trimmed = trim($var);
$terms = explode(' ',$trimmed);
// check for stop words and remove
$stop_words_file  = "list-of-english-stop-words.txt"; // load stop words file
$contents = addslashes(file_get_contents($stop_words_file)); // escape special characters
$stop_words = explode(',', $contents); // create array
foreach($terms as $key => $value) { // search user input for stop words
    if(in_array($value, $stop_words)) { // stop word found
        unset($terms[$key]); // remove it from array
    }
}
$terms = array_values($terms); // remove empty/NULL values from array
// perform search
$query = "SELECT * FROM Products WHERE MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category_description='".$search_dept."' OR MATCH(ProductName,Description) AGAINST ('+$terms[0]* +$terms[1]* +$terms[2]* +$terms[3]* +$terms[4]*' IN BOOLEAN MODE) AND category2='".$search_dept."' ORDER BY $orderby LIMIT $offset, $rowsPerPage";
于 2013-02-15T17:06:58.687 回答