Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一个好的PHP库可用于将布尔搜索运算符解析为MySQL全文运算符?_Php_Mysql_Boolean Search - Fatal编程技术网

是否有一个好的PHP库可用于将布尔搜索运算符解析为MySQL全文运算符?

是否有一个好的PHP库可用于将布尔搜索运算符解析为MySQL全文运算符?,php,mysql,boolean-search,Php,Mysql,Boolean Search,我们已经使用MySQL全文搜索好几年了,但是需求已经改变了。我们希望将AND/OR/NOT参数解析为MySQL能够理解的形式。我已经编写了一个单元测试,很明显这相当复杂 我相信会有更多的人遇到这个问题,所以我想一定有某种图书馆能够为我解决这个问题。我试过谷歌,但不幸的是,我没能找到这样的图书馆。有人知道好的吗 库应该能够处理引号、括号和/或/或非运算符,在我们的例子中,它应该默认为和而不是或(如果没有设置运算符)。以下是我的一些预期结果: “ict”变成“ict+ict” “ict it”变为

我们已经使用MySQL全文搜索好几年了,但是需求已经改变了。我们希望将AND/OR/NOT参数解析为MySQL能够理解的形式。我已经编写了一个单元测试,很明显这相当复杂

我相信会有更多的人遇到这个问题,所以我想一定有某种图书馆能够为我解决这个问题。我试过谷歌,但不幸的是,我没能找到这样的图书馆。有人知道好的吗

库应该能够处理引号、括号和/或/或非运算符,在我们的例子中,它应该默认为和而不是或(如果没有设置运算符)。以下是我的一些预期结果:

  • “ict”变成“ict+ict”
  • “ict it”变为“+ict+it”
  • “ict或it”变为“ict it”
  • “非ict”变为“ict”
  • “it非ict”变为“+it-ict”
  • “网络和(ict或it)”变为“+web+(ict it)”
  • “ict或(it和web)”变为“ict(+it+web)”
  • “ict非(ict、it和网络)”变为“+ict-(+ict+it+web)”
  • “php或(非web非嵌入式ict或it)”变为“php(-web-嵌入式ict it)”
  • “(网络或嵌入式)(ict或it)”变为“+(网络嵌入式)+(ict it)”
  • 开发和(web或(ict和php))“成为”+develop+(web(+ict+php))”
  • “ict”变为“+”ict“
  • “ict或it”保持“+”ict或it“
这是我们在过去几年中使用的功能(无法正常工作):


这可能无法回答您的问题,但如果您需要更高级的全文搜索功能,我建议您使用sphinx或apache solr之类的工具。

谢谢您的回答。我们知道Sfinx、Xapian和solr之类的解决方案。但现在,我们希望继续使用全文搜索。有人制作了几个类来解析用于布尔mysql查询的字符串。就我个人而言,我认为这是一个了不起的问题,我很想知道你是否找到了解决方案。在那时候,我用php编写了一个自定义关键字标记器和解析器,它发挥了所有的魔力。它对我们来说非常有效,但并不漂亮。我们从未发布过代码。我们已经使用了几年,在切换到Elasticsearch之前。非常有趣的是,其他人看到了你的问题并编写了一个类来回答它-我可以很好地补充一下。他们甚至使用了相同的样本数据。
/**
 * Parses search string.
 * @param string $s The unparsed search string.
 * @return string $s The parsed search string.
 */
public function parseSearchString( $s )
{
    // Place a space at the beginning.
    $s = ' ' . $s;

    // AND - Remove multiple spaces, AND, &.
    $s = preg_replace( '/\s\s+/', ' ', $s );
    $s = preg_replace( '/\sAND\s/i', ' ', $s );
    $s = preg_replace( '/\s&\s/', ' ', $s );

    // OR - Make replacements. Execute double, so we replace all occurences.
    $s = preg_replace( '/(\w+)\s(?:OR|\|)\s(\|?\w+)/i', '|\\1|\\2', $s );
    $s = preg_replace( '/(\w+)\s(?:OR|\|)\s(\|?\w+)/i', '|\\1|\\2', $s );
    $s = preg_replace( '/(\w+)\s*(?:\\\|\\/)\s*(\|?\w+)/i', '|\\1|\\2', $s );
    $s = preg_replace( '/(\w+)\s*(?:\\\|\\/)\s*(\|?\w+)/i', '|\\1|\\2', $s );

    // NOT
    $s = preg_replace( '/\bNOT\s(\w+)/i', '|-\\1', $s );

    // Quoted strings.
    $s = preg_replace( '/\s"/', ' +"', $s );

    // Place + in front of words.
    $s = preg_replace( '/\s(\w+)/', ' +\\1', $s );

    // Replace | to spaces.
    $s = preg_replace( '/\|/', ' ', $s );

    return trim( $s );
}