我有一个可搜索的单词和短语的mySQL数据库。如果用户输入长字符串,如何搜索数据库中包含在该字符串中的任何短语?
我是为单个单词而不是短语完成的。
答案 0 :(得分:2)
你想要在字段上提取FULLTEXT索引以使其更快,但你可以做到
SELECT *
FROM Table
WHERE MATCH ('column_name') AGAINST ('here is the phrase')
答案 1 :(得分:1)
也许使用mysql的全文功能?
http://devzone.zend.com/26/using-mysql-full-text-searching/
此示例使用Zend框架,但SQL是相同的。
如果您的索引/排名需求更复杂,有一些开源选项会设置单独的全文搜索服务器。
的Xapian http://xapian.org/
答案 2 :(得分:0)
如果您要经常搜索文本,那么全文将是您最好的选择。另外,我假设您的列是varchar(不是TEXT),否则LIKE将无效。
答案 3 :(得分:0)
你走了。这将取消用户输入的所有文本,获取单独的单词并查找任何单词(全部或部分 - 选择您在哪个子句中找到)
我们假设$ user_input是从$ _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/>';
以上结果是:
YOURCOL ='hi'或YOURCOL ='hello'或YOURCOL ='wh \'在'OR YOURCOL ='els; e'或YOURCOL ='是'或YOURCOL ='new'或YOURCOL ='select'或者YOURCOL ='1'或YOURCOL ='from'OR YOURCOL ='dual;'
YOURCOL IN('hi','hello','wh''at','els; e','is','new','select','1','from','dual; “)
YOURCOL喜欢'%hi%'或YOURCOL喜欢'%hello%'或YOURCOL喜欢'%wh''%'或YOURCOL喜欢'%els; e%'或YOURCOL喜欢'%is%'或YOURCOL LIKE '%new%'或YOURCOL LIKE'%select%'或YOURCOL LIKE'%1%'或YOURCOL类似'%from%'或YOURCOL LIKE'%dual;%'
答案 4 :(得分:0)
有货,你可以使用
SELECT * from <my_table> WHERE phrase_column LIKE '%my search phrase%'
但这将是一个非常慢的查询,因为它将无法使用任何索引。并且它不支持任何形态。
如果您有足够大的短语集,您可以在Sphinx中使用扩展查询语言中的短语运算符来执行短语搜索,如http://sphinxsearch.com/docs/current.html#extended-syntax
中所述基本上你可以安装Sphinx并创建简单的磁盘索引,其中包含你提到的MySQL表中的短语。稍后,您可以通过使用其他整数列为每个索引文档添加评级来增强所需的短语。
您可以在http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/找到快速的Sphinx配置指南启动Sphinx后,您可以连接到Sphinx并使用短语搜索:
SELECT * FROM <your_index_name> WHERE MATCH('"my search phase"');
请注意单(字符串)和双(短语操作符)括号。
Sphinx将返回短语ID,以便您可以非常快速的方式从MySQL中检索它们(通常使用主键选择)
另一个值得关注的地方是http://lucene.apache.org/,这是另一个很棒的全文搜索引擎。