如何在PHP中进行高级搜索?

时间:2013-03-15 21:07:59

标签: php mysql search

我想做一个表单,以便库的用户可以进行高级搜索。我以为我可以使用我的表单中硬编码的值并将它们附加到查询中(它们来自选择字段)。我还想过如何用尽可能少的代码来做这件事,所以如果有人选择(单词)(即搜索单词而不是短语),我会爆炸。我的最终代码如下:

<?php 

    /** 
     *  this variable is the result of the user    
     *  selecting 'word' or 'phrase'
    **/ 
    $coleccion = implode('&', $keysres);

    $contents_1 = array();
    $contents_2 = array();
    $contents_3 = array();

    $words_1 = array();
    $words_2 = array();
    $words_3 = array();

    switch ($coleccion) {

    case 'palabras&palabras&palabras': 

        $contents_1 = preg_split('/[\s,]+/', $buscar_1);

        foreach ($contents_1 as $word) {
            array_push($words_1, " MATCH ($contenido_1) AGAINST ('$word') ");
        }

        $contents_2 = preg_split('/[\s,]+/', $buscar_2);

        foreach ($contents_2 as $word) {
            array_push($words_2, " MATCH ($contenido_2) AGAINST ('$word') ");
        }

        $contents_3 = preg_split('/[\s,]+/', $buscar_3);

        foreach ($contents_3 as $word) {
            array_push($words_3, " MATCH ($contenido_3) AGAINST ('$word') ");
        }

        $search_words_1 = implode(" OR ", $words_1);
        $search_words_2 = implode(" OR ", $words_2);
        $search_words_3 = implode(" OR ", $words_3);

        $consulta = "
                SELECT * 
                FROM catalogo 
                WHERE 
                   $search_words_1 ". 
                   $oper_1 
                   ." $search_words_2 ". 
                   $oper_2 ." 
                   $search_words_3 ";
    break;

?>

问题在于,当我更改选择字段的值时,假设某人选择执行OR操作而不是AND,并选择对我的第二个文本字段执行短语搜索,在这种情况下,我看不到搜索被限制或扩大。例如,我使用$coleccion=palabras&frase&palabras的情况执行变量转储,然后执行查询的var_dump,然后显示:SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('bariones') OR MATCH(titulo) AGAINST('mesones y totems') AND MATCH (titulo) AGAINST ('bariones')

所以我的问题是¿在SQL中限制/扩大搜索的正确方法是什么?不幸的是,我没有太多的数据库条目来测试。

最后,我还设置了一些东西,以便尝试获取所有记录“除了”的查询最终会出现这种语法:

SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH  (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND NOT MATCH(titulo) AGAINST('mesones') AND NOT MATCH (titulo) AGAINST ('bariones')  

但是我想知道这样的查询是否真的排除了指定的记录。或者我应该在BOOLEAN模式中使用前导减号,根据:

  

前导减号表示该单词不得出现   返回的任何行。   注意: - 运算符仅用于排除其他行   与其他搜索字词匹配。因此,布尔模式搜索即   仅包含前面带有的术语 - 返回空结果。它不是   返回“除包含任何排除条款的行之外的所有行。

我想我现在有一个关于我怀疑的例子。假设以下查询:

SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH     (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('totems') AND NOT MATCH(titulo) AGAINST('bariones')

然后我想这应该显示所有带有'comunicaciones','y'和'poder'以及带有'mesones','y'和'totems'字样的记录,但不显示那些带有ord'bariones'。 但是,该查询的结果只是那些在我的数据库中使用comunicaciones一词的结果

0 个答案:

没有答案