
跟你聊聊所谓的智能搜索吧。
不用 like 实现你说的智能一些的搜索。首先你得做一套分词系统。就是把你那一句话分成若干个词。
比如“你是个非常牛逼的二傻子”这句话。你不能把“你是个”当成一个词吧。 智能一点的分词应该是把“你、非常、牛逼、傻子”分出来。
然后就开始涉及到一个权重问题了。就是 你分出来的这些词 到底你希望哪些符合条件的结果排在签名。很明显上面那句话 傻子的权重要高一些。其次是牛逼。。。
然后 根据权重结果匹配呈现出结果来。。。
基本上 搜索引擎都是这么干的。 分词---数据查询----权重排序----结果呈现。。。。
MySQL中的全文索引类型FULLTEXT的索引。 FULLTEXT 索引仅可用于 MyISAM 表他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或 CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。全文搜索同MATCH()函数一起执行。
mysql CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)- )Query OK, 0 rows affected (0.00 sec)
mysql 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 ...')
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql SELECT * FROM articles
- WHERE MATCH (title,body) AGAINST ('database')
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial| DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
MATCH()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在FULLTEXT内的列。搜索字符串作为对AGAINST()的参数而被给定。对于表中的每一行, MATCH() 返回一个相关值,即, 搜索字符串和 MATCH()表中指定列中该行文字之间的一个相似性度量。
在默认状态下, 搜索的执行方式为不区分大小写方式。然而,你可以通过对编入索引的列使用二进制排序方式执行区分大小写的全文搜索。 例如,可以向一个使用latin1字符集的列给定latin1_bin 的排序方式,对于全文搜索区分大小写。
如上述所举例子,当MATCH()被用在一个 WHERE 语句中时,相关值是非负浮点数。零相关的意思是没有相似性。相关性的计算是基于该行中单词的数目, 该行中独特子的数目,资料库中单词的总数,以及包含特殊词的文件(行)数目。
对于自然语言全文搜索,要求MATCH() 函数中命名的列和你的表中一些FULLTEXT索引中包含的列相同。对于前述问讯, 注意,MATCH()函数(题目及全文)中所命名的列和文章表的FULLTEXT索引中的列相同。
你有没有想过如何使用搜索功能在所有整站中实现!互联网博客和网站,大多数都采用MySQL数据库。MySQL提供了一个美妙的方式实施一个小的搜索引擎,在您的网站(全文检索)。所有您需要做的是拥有的MySQL 4.x及以上。MySQL提供全文检索功能,我们可以用它来 ??实现搜索功能。
首先,让我们为我们的例子中设置一个示例表。我们将创建一个名为第一个表。
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
)
在此表中还可以添加一些示例数据。执行后,插入查询。
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查询。
SELECT * FROM articles
WHERE MATCH (title,body) AGAINST ('database')
你就能看到结果如下:
在下面的数据库比较5 MySQL与YourSQL的...
MySQL教程DBMS 1代表数据库...
我们在上面的SQL查询(标题,正文)反对(“数据库”)的比赛,选择所有的记录,列标题和正文进行全文搜索。
您可以修改该查询,并创建您自己的版本,以自己的数据库中执行全文搜索。
布尔全文搜索
它可能发生,你要指定某些关键字在您的搜索条件。此外,您可能要忽略某些关键字。布尔全文搜索可以用来执行这些要求的全文检索。
检查下面的SELECT查询。
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE)
如果您发现上述选择查询,我们增加了布尔MODE反对()。这个查询将获取MySQL的关键字,但不YourSQL关键字的所有记录。请注意+和-我们以前指定的关键字!
在执行此功能,MySQL使用什么有时也被称为布尔逻辑作为暗示,其中:+代表与-代表不是[无 *** 作员]暗示或
以下是几个例子布尔搜索条件。
“苹果香蕉
查找行至少包含两个词之一。
“+苹果+果汁”
寻找包含两个单词的行。
“+苹果Macintosh
查找行包含“苹果”,但排名的行,如果它们也包含“麦金塔”。
“+苹果Macintosh的”
查找行包含“苹果”这个词,而不是“麦金塔”。
'+苹果Macintosh的“
查找包含单词“苹果”的行,但如果该行也包含单词“麦金塔”,速度比如果行不低。这是“软”比“+苹果Macintosh电脑”,为“麦金塔”的存在,导致该行不能在所有返回的搜索。
'+苹果+(>营业额<馅饼)“
行包含“苹果”和“营业额”,或“苹果”和“馅饼”(任何顺序)的话,但排名“苹果的营业额”比“苹果馅饼“。
限制
支持全文检索的MyISAM表只。MySQL 4.1中,使用多个字符设置一个单一的表内的支持。然而,在一个FULLTEXT索引的所有列,必须使用相同的字符集和校对规则。MATCH()列列表必须匹配完全在一些列清单表的FULLTEXT索引定义,除非这场比赛()是在布尔模式。布尔模式搜索,可以做非索引列,虽然他们很可能是缓慢的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)