我的sql查询只返回精确的字符串匹配。有没有办法返回最近的比赛?

时间:2015-07-03 08:17:16

标签: php mysql regex search search-engine

我有一个网站存储了很多pdf文章。这些文章的字段,例如标题,作者等存储在MySQL数据库中。我想构建一个搜索,返回字段'title'的最近匹配项,并让搜索返回结果。

例如,我可能会有以下标题的文章:

  1. '在脑肿瘤中失调的增殖和分化。'
  2. '肿瘤诱导的髓样功能障碍及其对癌症免疫治疗的意义。'
  3. '炎症性肠病和癌症的表观遗传改变。'
  4. 因此,如果我进入搜索:'癌症和表观遗传学',标题类似于(3)的文章将显示在结果中。

    目前,当我生成一个sql搜索查询时,只有完全匹配才会返回结果。有人可以告诉我如何推进这个问题吗?一些广泛的笔触和指针将非常受欢迎。

    我的PHP代码:

     // HANDLES SEARCH INPUT
    if(isset($_POST['searchstring'])){
    
    $searchterm = $_POST['searchstring'];
    
    if($mysqli->connect_errno){
    /*echo 'error connecting to the database';*/
        echo 'error db connection';
        exit();
    }
    
    $searchterm = $mysqli -> real_escape_string($searchterm);
    
    $sql = "SELECT id FROM pdf_library WHERE title='$searchterm'";
    
    $result = $mysqli -> query($sql);
    if($result){
        $num_rows = $result -> num_rows;
        if($num_rows <1){
            echo 'no_result';
        }else{
            echo 'you_have_results';
        }
    
    }else{
        echo 'searh failed';
        exit();
    }   
    

    }

    我的javascript代码:

     var search_btn = document.getElementById('searchbtn');
     search_btn.addEventListener('click', function(){
    var string = document.getElementById('search_input').value;
    console.log('search string: ' + string);
    
    //AJAX REQUEST
    var formdata = new FormData();
    formdata.append('searchstring', string);
    
    // xmlhttpRequest object
    var xmlhttp = new XMLHttpRequest;
    
    xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
            if(xmlhttp.responseText == 'no_result'){
                console.log('no results found');
            }else if(xmlhttp.responseText == 'you_have_results'){
                console.log('results found');
            }else{
                console.log(xmlhttp.responseText);
            }
        }
    }
    xmlhttp.open('POST', 'search_aux.php');
    xmlhttp.send(formdata);
    

    });

3 个答案:

答案 0 :(得分:0)

根据 Levenshtein距离的某些方面可能会有所帮助。

http://www.artfulsoftware.com/infotree/queries.php#552

MySQL - Finding Close Matches

答案 1 :(得分:0)

SQL wildcards可能对您有用:

  

%替换零个或多个字符

     

_替换单个字符

     

[charlist]设置和匹配的字符范围

     

[^charlist][!charlist]仅匹配未在括号中指定的字符

而且,就像@Djip在评论中所说的那样,你需要使用带有通配符的LIKE

SELECT id FROM pdf_library WHERE title LIKE '%$searchterm%' 

答案 2 :(得分:0)

我认为你实际上必须将你正在寻找的东西视为标签。也就是说,在癌症和表观遗传学中,&#34;你有2个标签(癌症,表观遗传学)和分离器(和)。我会建立一个标签列表(数组),然后在每个标题中搜索它们,即查看字符串&#34;癌症&#34; &安培; &#34;表观遗传学&#34;包含在标题中。

当然,你会在某些标题中获得比其他标题更多的点击,这会转化为分数,因此你可以根据它对输出进行排序。

实际上,您应该只允许用户输入由固定分隔符(例如逗号)分隔的标签,然后执行上述操作。