我有一个网站存储了很多pdf文章。这些文章的字段,例如标题,作者等存储在MySQL数据库中。我想构建一个搜索,返回字段'title'的最近匹配项,并让搜索返回结果。
例如,我可能会有以下标题的文章:
因此,如果我进入搜索:'癌症和表观遗传学',标题类似于(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);
});
答案 0 :(得分:0)
根据 Levenshtein距离的某些方面可能会有所帮助。
答案 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;包含在标题中。
当然,你会在某些标题中获得比其他标题更多的点击,这会转化为分数,因此你可以根据它对输出进行排序。
实际上,您应该只允许用户输入由固定分隔符(例如逗号)分隔的标签,然后执行上述操作。