Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.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_Full Text Search - Fatal编程技术网

Php 在mySQL数据库中搜索短语

Php 在mySQL数据库中搜索短语,php,mysql,full-text-search,Php,Mysql,Full Text Search,我有一个可以搜索的单词和短语的mySQL数据库。如果用户输入一个长字符串,如何在数据库中搜索包含在该字符串中的任何短语 我只为单个单词而不是短语做了这项工作。也许可以使用mysql的全文功能 本例使用Zend框架,但SQL是相同的 如果您的索引/排名需要更复杂,则有一些开源选项可以设置单独的全文搜索服务器 斯芬克斯 夏平 您可能希望在字段上拉一个全文索引以加快速度,但您可以这样做 SELECT * FROM Table WHERE MATCH ('column_name') AGAINST

我有一个可以搜索的单词和短语的mySQL数据库。如果用户输入一个长字符串,如何在数据库中搜索包含在该字符串中的任何短语


我只为单个单词而不是短语做了这项工作。

也许可以使用mysql的全文功能

本例使用Zend框架,但SQL是相同的

如果您的索引/排名需要更复杂,则有一些开源选项可以设置单独的全文搜索服务器

斯芬克斯

夏平

您可能希望在字段上拉一个全文索引以加快速度,但您可以这样做

SELECT *
FROM Table
WHERE MATCH ('column_name') AGAINST ('here is the phrase')

如果你打算经常搜索文本,那么全文将是你最好的选择。另外,我假设您的列是varchar(不是TEXT)或LIKE,否则将不起作用。

给您。这将获取用户输入的所有文本,获取单独的单词并查找其中任何一个单词(全部或部分-选择您需要的where子句)

假设$user\u输入是从$u POST设置的

$user_input = $_POST;
// try this one for sample data $user_input = "hi hello wh'at els;e is new select 1 from dual;";
$user_input_array = array_map('mysql_real_escape_string', explode(' ',$user_input));
$where_clause = "YOURCOL = '".implode("' OR YOURCOL = '", $user_input_array)."'";

echo $where_clause.'<br/>';

// if you want to use IN 
$where_clause = " YOURCOL IN ('".implode("', '", $user_input_array)."')";
echo $where_clause.'<br/>';

// if you want to use LIKE

$where_clause = "YOURCOL LIKE '%".implode("%' OR YOURCOL LIKE '%", $user_input_array)."%'";
echo $where_clause.'<br/>';
$user\u input=$\u POST;
//对于示例数据$user_input=“hi hello wh'at els;e是新的,请从dual;中选择1;”尝试此选项;
$user\u input\u array=array\u map('mysql\u real\u escape\u string',explode('',$user\u input));
$where_子句=“YOURCOL=”。内爆(“'OR YOURCOL=”,$user_input_array)。“;
echo$where_子句“
”; //如果您想在中使用 $where_子句=“yourcolin(”。内爆(“,”,$user_input_array)。”); echo$where_子句“
”; //如果你想用LIKE $where_子句=“类似于“%”的YOURCOL。内爆(“%”或类似于“%”的YOURCOL,$user_input_array)。“%”; echo$where_子句“
”;
上述结果如下:

YOURCOL='hi'或YOURCOL='hello'或YOURCOL='wh'at'或YOURCOL='els;e'或YOURCOL='is'或YOURCOL='new'或YOURCOL='select'或YOURCOL='1'或YOURCOL='from'或YOURCOL='dual;'

yourcolin('hi','hello','wh'at','els;e','is','new','select','1','from','dual;'))


YOURCOL如“%hi%”或YOURCOL如“%hello%”或YOURCOL如“%wh\\ at%”或YOURCOL如“%els”;e%'或类似YOURCOL的“%is%”或类似YOURCOL的“%new%”或类似YOURCOL的“%select%”或类似YOURCOL的“%1%”或类似YOURCOL的“%from%”或类似YOURCOL的“%dual;”

您可以使用的库存MySQL

SELECT * from <my_table> WHERE phrase_column LIKE '%my search phrase%' 
从WHERE短语_列中选择*,如“%my search phrase%”
但这将是一个非常缓慢的查询,因为它将无法使用任何索引。它不支持任何形态

若您有足够大的短语集,您可以从Sphinx中的扩展查询语言雇用短语操作符来执行短语搜索,如中所述

基本上,您可以安装Sphinx并创建简单的磁盘索引,其中包含您提到的MySQL表中的短语。稍后,您可以通过使用额外的整数列为索引的每个文档添加评级来增强所需的短语

您可以在上找到快速Sphinx配置指南启动Sphinx后,您可以连接到Sphinx并使用短语搜索:

SELECT * FROM <your_index_name> WHERE MATCH('"my search phase"'); 
从匹配的位置选择*(““我的搜索阶段”);
请注意单括号(字符串)和双括号(短语运算符)

Sphinx将返回短语ID,以便您可以非常快速地从MySQL检索它们(通常使用主键选择)


另一个值得一看的地方是另一个很棒的全文搜索引擎。

我应该说这个解决方案比@Brad的解决方案工作得更快,但如果你想搜索准确的短语,这是错误的解决方案。我想唯一正确的方法是用Brad的方法过滤这个查询得到的结果我已经有了一个数据库,其中有各种各样的短语,如“只要”,“谢谢”,“启动”和成千上万的其他短语。。如果用户输入字符串“只要我忙,我就不能启动系统”,我应该能够从中提取“只要”和“启动”。我想,我无法从数据库中提取每个短语并在字符串中搜索其出现的位置。那将是非常无效的。我是否无法使用用户的输入字符串查找数据库中出现的任何短语?我想知道您是否愿意共享您拥有的此数据库?我这样问是因为我在寻找一个包含两个单词短语的表格(或列表)。我知道如果你不能(这个问题已经很老了),但我只是想试试。