`
chenhsong
  • 浏览: 43964 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

MySQL使用全文本搜索

阅读更多

1.理解全文本搜索
    MySQL数据库支持几种基本的数据库引擎中,并不是所有的引擎都支持本文所描述的全文本搜索。在两种最常用的引擎MyISAM和InnoDB中,只有前者支持全文本搜索,而后者不支持。所以如果需要对表进行全文本搜索,则需要把该表的引擎设置为MyISAM。
    全文本搜索有比LIKE匹配和正则表达式匹配更强的功能,在对表进行全文本搜索时,MySQL不需要分表查看每个行,不需要分别分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样,MySQL可以有效的决定哪些词匹配(哪些行包含他们),哪些词不匹配,他们的匹配频率,等等。

2.使用全文本搜索
    为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断的重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。
    在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。
    2.1启用全文本搜索支持
         一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
      

CREATE TABLE productnotes
(
    note_id      INT              NOT NULL AUTO_INCREMENT,
    prod_id      CHAR(10)    NOT NULL,
    note_date  DATETIME   NOT NULL,
    note_text   TEXT           NULL,
    PRIMARY KEY(note_id),
    FULLTEXT(note_text)
)   ENGINE=MyISAM

         这里只指定了一个列note_text进行索引,如果需要也可以指定多个列。

         在定义之后,MySQL自动维护该索引。增加、删除和更新行之后,索引会随之自动更新。

         可以在创建表时使用FULLTEXT,也可以稍后使用。

         注意:不要在导入数据时使用FULLTEXT。

        

    2.2进行全文本搜索

         在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()制定被搜索的列,Against()  指定要使用的搜索表达式:

         

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('rabbit')\G

输出结果:

*************************** 1. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparen
tly less effective now.
*************************** 2. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
2 rows in set (0.00 sec)

 

          注意:1。传递给Match()的值必须与FULLTEXT()定义的相同。如果指定多个列,则必须列出它们且次序正确。

                    2.  除非使用BINARY方式,否则全文本搜索不区分大小写。

          下面演示排序的工作方式:

          

SELECT note_text,MATCH(note_text) Against('rabbit') AS rank
FROM `productnotes`

    输出结果:

*************************** 1. row ***************************
note_text: Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.
     rank: 0
*************************** 2. row ***************************
note_text: Can shipped full, refills not available.
Need to order new can if refill needed.
     rank: 0
*************************** 3. row ***************************
note_text: Safe is combination locked, combination not provided with safe.
This is rarely a problem as safes are typically blown up or dropped by customers.
     rank: 0
*************************** 4. row ***************************
note_text: Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.
     rank: 1.59055435657501
*************************** 5. row ***************************
note_text: Included fuses are short and have been known to detonate too quickly for some customers.
Longer fuses are available (item FU1) and should be recommended.
     rank: 0
*************************** 6. row ***************************
note_text: Matches not included, recommend purchase of matches or detonator (item DTNTR).
     rank: 0
*************************** 7. row ***************************
note_text: Please note that no returns will be accepted if safe opened using explosives.
     rank: 0
*************************** 8. row ***************************
note_text: Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.
     rank: 0
*************************** 9. row ***************************
note_text: Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.
     rank: 0
*************************** 10. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
     rank: 1.64080536365509
*************************** 11. row ***************************
note_text: Shipped unassembled, requires common tools (including oversized hammer).
     rank: 0
*************************** 12. row ***************************
note_text: Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.
     rank: 0
*************************** 13. row ***************************
note_text: Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.
     rank: 0
*************************** 14. row ***************************
note_text: Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
Comment forwarded to vendor.
     rank: 0
14 rows in set (0.00 sec)

         

          在本例中。使用Match()和Against()建立一个计算列(别名rank),此列包含全文本搜索计算出的等级值。等级由MySQL根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目计算出来。正如所见,不包含rabbit的行等级为0.确实包含词rabbit的两行每行都有一个值,文本中词靠前的行的等级值比靠后的等级值高。

           如果指定多个搜索项,则包含多数匹配词的行将具有更高的等级值。

      2.3使用查询扩展

           利用查询扩展,能找出可能相关的结果,即使他们并不精确包含所要查找的词。

     

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('anvils' WITH QUERY EXPANSION)

 

      输出结果:

*************************** 1. row ***************************
note_text: Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.
*************************** 2. row ***************************
note_text: Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.
*************************** 3. row ***************************
note_text: Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.
*************************** 4. row ***************************
note_text: Please note that no returns will be accepted if safe opened using explosives.
*************************** 5. row ***************************
note_text: Customer complaint: rabbit has been able to detect trap, food apparently less effective now.
*************************** 6. row ***************************
note_text: Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.
*************************** 7. row ***************************
note_text: Matches not included, recommend purchase of matches or detonator (item DTNTR).
7 rows in set (0.00 sec)

           可以看出,只有第一行包含词anvils,因此等级最高。第二行与词anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来,第三行业包含相同的词,但他们,他们文本中的位置更靠后且分开的更远,所以排在第三。

      2.4 布尔文本搜索

             MySQL同时还支持布尔方式(boolean mode)。可以支持以下细节:

             ■要匹配的词;

             ■要排斥的词;

             ■排列提示;

             ■表达式分组;

             ■其他。

             布尔文本搜索在没有建立索引的情况下也能使用,但速度会变得非常缓慢。

 

全文本布尔搜索操作符

     布尔操作符                    说明

           +                          包含,词必须存在

-                                       排除,词不必出现

>                        包含,而且增加等级值

<                        包含,且减小等级值

()                        把词组成子表达式

~                         取消一个词的排序值

*                         词尾的通配符

""                       定义一个短语

 

          

            举例说明这些操作符的使用:

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('+rabbit +bait' IN BOOLEAN MODE)
/*这个搜索匹配包含词rabbit和bait的行*/

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('rabbit bait' IN BOOLEAN MODE)
/*没有指定操作符,匹配包含rabbit和bait的任意一个的行*/

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('"rabbit bait"' IN BOOLEAN MODE)
/*匹配短语rabbit bait*/

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('>rabbit <carrot"' IN BOOLEAN MODE)
/*增加前者等级,减少后者等级*/

SELECT note_text
FROM `productnotes`
WHERE MATCH(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
/*搜索匹配词safe和combination,并降低后者等级*/

        2.5使用说明

        ■在索引全文本数据时,短词被忽略且从索引中排除。短词定义为三个或三个以下字符的词(数目可以更改)

        ■MySQL带有一个内建的stopword列表,这些词在索引中是被忽略的,如果需要,可以覆盖这个列表。

        ■许多词出现的频率很高,搜索他们没用处。MySQL规定如果一个词出现50%以上的行中,则作为一个stopword忽略。这个规则不适用于全文本布尔搜索。

        ■如果表中行数少于三行,全文本搜索不返回结果。(因为每个词或者不出现,或者至少出现在50%的行中)

        ■忽略词中的单引号。例如,don't索引为dont。

        ■不具有词分隔符(如汉语和日语)的语言不能恰当地返回全文搜索结果。

        ■仅在MyISAM数据库引擎中支持全文本搜索。

        


 

1
4
分享到:
评论

相关推荐

    elasticsearch配合mysql实现全文搜索.docx

    与MySQL结合使用,Elasticsearch可以实现高效、复杂的全文搜索。MySQL是流行的关系型数据库管理系统,它存储结构化数据,而Elasticsearch则擅长处理非结构化的搜索需求。 在配置Elasticsearch进行全文搜索前,确保...

    如何在MySQL中提高全文搜索效率

    在MySQL中提高全文搜索效率是优化数据库性能的关键步骤,尤其是对于那些处理大量文本数据的应用程序...正确配置和使用全文索引,对于那些需要处理大量文本信息的互联网应用来说,是提升用户体验和系统性能的关键策略。

    用Sphinx搭建MySQL中文全文搜索

    本文将详细介绍如何使用Sphinx搭建MySQL的中文全文搜索。 首先,Sphinx是一个开源的全文搜索引擎,它的设计目标是提供快速、准确、可扩展的全文检索能力。Sphinx支持多种数据库源,包括MySQL,能够与之紧密结合,...

    mysql实现全文检索

    MySQL全文检索是一种高效的数据搜索机制,它允许用户执行类似搜索引擎的查询,显著提高了在大量文本数据中寻找特定信息的速度。全文检索在MySQL中主要应用于MyISAM存储引擎,因为MyISAM支持对大表的数据快速读取,...

    mysql.data版本集合

    3. **全文搜索**:如果“给定关键字不在字典中”是因为查询涉及的是文本字段,考虑使用全文搜索引擎如MySQL的Full-Text Search功能,或者更强大的解决方案如Elasticsearch。 4. **错误处理**:在应用程序中,应适当...

    Mysql全文搜索match against的用法

    - 使用全文索引可以显著提高大型数据库的搜索性能,尤其是在数据预加载后创建索引的情况下。 了解这些知识点后,你可以更好地设计和优化你的MySQL数据库以支持全文搜索,特别是对于处理大量文本数据的应用场景。

    mysql64位版本

    3. **Full-text Search改进**:全文搜索引擎得到了升级,支持更多的查询操作,如全文本搜索、词语近似度搜索和查询优化。 4. **性能优化**:5.5版本增强了查询缓存,提升了查询执行效率,并引入了性能分析工具,如...

    mysql数据库全文多库多表查找,查询所有数据库中包含指定字符的数据。

    mysql数据库全文查找,查询所有数据库中包含指定字符的数据。 一、支持功能: 1、支持所有数据库查询字符串,或者指定一个或者多个数据库查询字符串; 2、支持本地使用或者指定远程数据库地址; 3、支持命令行指定...

    MYSQL高性能全文检索介绍-E文版

    本篇文章将深入探讨MySQL的全文检索机制,以期帮助你构建高效的全文搜索引擎。 全文检索在信息检索领域扮演着关键角色,特别是在海量数据中查找相关信息时。MySQL的全文索引和搜索功能,始于版本5.6,进一步完善于...

    mysql 全文模糊查找 便捷解决方案

    MySQL作为广泛使用的开源关系型数据库,提供了多种方式进行全文搜索和模糊匹配。本篇将聚焦于MySQL的全文模糊查找及其便捷解决方案,并结合PHP的Unicode工具类进行讨论。 MySQL的全文索引和搜索功能允许我们快速...

    mysql根据汉字首字母搜索

    在数据库表中没有录入汉字对应的拼音首字母的情况下,进行汉字拼音首字母搜索,下载文本后 直接在mysql中执行,后就可实现根据拼音搜索功能

    mysql-5.5.36-win 安装包 5.5.36版本

    4. **Full-text Search增强**:此版本改进了全文搜索功能,支持部分索引和短语搜索,提高了搜索效率。 5. **分区功能**:MySQL 5.5加强了分区功能,允许用户对大型表进行更有效的管理,通过分区策略来提高查询速度...

    mysql 全文搜索 技巧

    2. **自然语言搜索**:默认情况下,MySQL的全文搜索使用自然语言搜索模式。这种方式适用于大多数情况,但对于复杂的需求可能不够精确。 3. **使用WITH QUERY EXPANSION**:此选项允许MySQL扩展搜索词以提高搜索质量...

    在MySQL中获得更好的全文搜索结果

    在此,开发 者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索 引来优化搜索),而且实现了更高质量的搜索,因为MySQL...

    基于MySQL的中文全文搜索研究.pdf

    在使用n-gram parser插件进行中文全文搜索前,需在MySQL配置文件(my.cnf或my.ini)中设定分词大小(ngram_token_size),例如设置为2,这意味着连续的两个字会被视为一个分词单元。分词大小的选择应根据实际数据库...

    MySQL中文全文索引插件64位版本

     ③、标准插件式:以MySQL 5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL的其他功能,可快速跟进MySQL新版本;  ④、支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 ...

    MySQL全文搜索[文].pdf

    MySQL全文搜索是数据库管理系统MySQL中的一种高级特性,用于在大量文本数据中进行高效的数据检索。在MySQL 3.23.23版本之后,...了解并掌握全文搜索的使用方法,对于提升MySQL数据库的应用性能和用户体验具有重要意义。

Global site tag (gtag.js) - Google Analytics