【问题标题】:How to identify stopwords before making mysql query如何在进行 mysql 查询之前识别停用词
【发布时间】:2013-02-23 17:47:57
【问题描述】:

我正在尝试为 web 应用设置文本搜索。我的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] 是停用词或小于最小单词长度,则查询返回空值。我认为最好的解决方案是从停用词中删除“+”或从 :keyStr 中完全删除停用词。

有什么好的方法可以做到这一点吗?在进行查询之前,我是否需要检查是否有任何 word[x] 在 stopwords_list 中?

【问题讨论】:

标签: php javascript mysql full-text-search


【解决方案1】:

使用 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);

【讨论】:

  • 这行得通。但是,mysql 已经根据停用词列表和 min_word_length 检查每个单词。在客户端检查停用词似乎我做了两次工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多