我正在尝试设置一个webapp的文本搜索。我的mysql查询如下:SELECT * FROM t1 WHERE MATCH (c1,c2,c3) AGAINST (:keyStr IN BOOLEAN MODE)
我希望keyStr中的所有单词都匹配,因此keyStr看起来像::keyStr='+word[0]* +word[1]* +word[2]* + ... +word[n]*'
如果任何单词[x]是一个stopword或小于最小单词长度,则查询返回空值。我认为最好的解决方案是从stopword中删除“+”,或者完全从:keyStr中删除stopword。
有什么好办法吗?在进行查询之前,是否需要检查stopwords_list中是否有单词[x]?
最佳答案
使用javascript实现这一点的一个简单方法是:
var apart = "Some +example search that I made up".toLowerCase().replace(/[\+\-\?]*/g, '').split(' '),
stop_words = ['the', 'that', 'a', 'example'],
min_word_length = 1;
// filter the array to remove stop words
apart.filter( function( item ) {
if ( item.length < min_word_length ) return false;
return stop_words.indexOf( item ) === -1;
});
编辑:虽然从伪代码的角度来看,上面的代码可以工作,但这里有一个PHP解决方案
$query = "This is my example search query";
$search = explode(' ', $query);
$stop_words = array('is', 'a', 'the');
$terms = array_filter($search, function($item){
return !in_array($item, $stop_words);
});
$formatted = array_map(function($term){
return '+'.mysql_escape_string($term).'*';
}, $terms);
// :keyStr = implode(' ', $formatted);