0

我目前有以下内容,它将在我的数据库中搜索一个字段以提及一个单词,但想知道是否有可能如果客户输入两个单词,而不是只输出与该特定格式匹配的任何内容,它实际上会分裂单词向上并返回两个单词不完全匹配的结果:

目前有

   WHERE title LIKE '%SEARCH TEXT HERE%'..

因此,如果用户当前输入“FISH”或“FISH FOOD”,那么它将仅返回其中包含该文本的列。

我希望发生的是,如果他们输入了多个单词,那么它实际上会将其拆分,然后搜索并返回所有单独单词的结果。

因此,“FISH FOOD”将返回所有带有单词 fish 或 food with in 的行,而不仅仅是与“FISH FOOD”匹配的任何行

使用 PHP 和 MySQL

谢谢

4

4 回答 4

2

您需要分解关键字字符串并执行如下查询:

WHERE title LIKE '%SEARCH%' OR title LIKE '%TEXT%' OR title LIKE '%HERE%'..

虽然更复杂,但如果您符合全文的学习曲线,我会同意 bpgergo 的回答。它比简单的“LIKE”查询有很多优点。考虑一下:

SELECT * FROM article WHERE title like '%BIO%'

这将返回带有“BIOLOGY”、“BIography”等的任何内容。全文理解单词边界,因此这些“挑战”是地址。此外,您可以使用匹配的相关性,并在对结果进行排序时使用它。

它还考虑“停止”词,所以如果用户输入“我的鱼的食物”,它仍然只会匹配“食物”和“鱼”,因为“for”和“my”是常见的词,会被省略。

于 2012-05-25T16:04:02.800 回答
1

将您的搜索字符串分成几部分(explode(" ", $string))。然后为每个部分添加一个条件标题 LIKE "%$part%' OR title LIKE "%$part%' OR ...

于 2012-05-25T16:03:31.173 回答
1

感谢@Greg P、@ErikFWinter 和@bpgergo 对我当时正在研究这种方法的回复,最好添加我的答案以供将来参考:

  $search = explode(' ', $title);
    $searchResults = 'LIKE ';
    foreach ($search as $id => $word) {
        $searchResults .= "'%" . $word . "%'";
        $searchResults .= " OR title LIKE ";
    }
    $searchResults = rtrim($searchResults," OR title LIKE ");

    return $this->db->select("SELECT videoid, title, formatloc FROM db_vList WHERE title {$searchResults} order by title asc");

可能有一个更简单的原因,但学习是非常值得学习的。

于 2012-05-25T16:43:18.287 回答
0

先生,您需要的是 MySQL 的 FULLTEXT 索引。

这是一个详细的示例,可以满足您的需求。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

编辑这是一个纯 SQL 解决方案。

为了方便SO,我在这里复制了相关的SQL:

CREATE TABLE articles (
d INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
ENGINE=MyISAM;

INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When configured properly, MySQL ...');

SELECT id, body, MATCH (title,body) AGAINST
('Security implications of running MySQL as root') AS score
FROM articles WHERE MATCH (title,body) AGAINST
('Security implications of running MySQL as root');
于 2012-05-25T16:06:38.123 回答