登陆注册
7538600000028

第28章 MySQL的全文搜索(2)

可能在搜索“女人”,而结果搜索出的前几条记录都是把“女人”和“皮包”放在一起,这将导致最后得到的结果是关于“皮包”的搜索。因为MySQL会认为“皮包”属于“女人”这个类别。

6.2.5微调MySQL全文搜索

为了更加有效,需要对全文搜索谨慎调节。实际上,在大多数情况下,修改默认性能只能降低其性能。除非清楚自己在做什么,否则不要改变MySQL源。

大多数全文变量必须在服务器启动时被设置。为了改变它们,还要重新启动服务器;一些变量的改变需要重建表中的FULLTEXT索引。

1.被编入索引单词的长度

MySQL全文搜索将任何单字字符(字母、数字和下划线部分)的序列视为一个单词。这个序列或许也包含单引号("),但在一行中不会超过一个。这意味着aaa"bbb会被视为一个单词,而aaa""bbb则被视为2个单词。位于单词之前或其后的单引号会被全文搜索分析程序去掉;"aaa"bbb"会变成aaa"bbb。

全文搜索分析程序会通过寻找某些分隔符来确定单词的起始位置和结束位置,例如,间隔符号("")、逗号(,)及句号(.)。假如单词没有被分隔符分开,(例如在中文里),则全文搜索分析程序不能确定一个词的起始位置和结束位置。为了能够在这样的语言中向全文索引添加单词或其他编入索引的术语,必须对它们进行预处理,使其被一些诸如间隔符之类的任意分隔符分隔开。

ft_min_word_len和ft max word len这两个系统自变量规定了被编入索引单词的最小长度和最大长度,默认的最小值为四个字符;默认的最大值取决于使用的MySQL版本。

假如改变任意一个值,那么就必须重建FULLTEXT索引。例如,若你希望一个3字符的单词变为可查找项,则可以通过将以下行移动到一个供选择文件里,从而设置ft_min_word_len变量:

[mysqld]

ft_min_word_len=3

然后重新启动服务器,重建FULLTEXT索引。

2.覆盖默认忽略词

若要覆盖默认忽略词,则可设置ft stopword file系统变量。变量值应为包含忽略词的文件路径名,或是用来截止禁用词过滤的空字符串。在改变了这个变量的值或禁用词文件的内容后,重建你的FULLTEXT索引。

忽略词是自由形态的,换言之,可使用任何诸如newline,space或comma这样的非字母数字字符来分隔禁用词。下划线字符()和被视为单词的一部分的单引号(")例外。

3.50%阈值

自然语言查询的50%阈值由所选择的特别权衡方案所决定。若要阻止它,首先在myisam/ftdefs.h中寻找以下行:

# define GWS IN USE GWS PROB

将该行改为:

# define GWS IN USE GWS FREQ

然后重新编译MySQL。此时不需要重建索引。

注意:这样做会严重降低MySQL为MATCH()函数提供合适的相关值的能力。假如真的需要搜索这样的普通词,建议使用INBOOLEAN MODE,因为它不遵循50%阈值。

4.改变用于布尔全文搜索的操作符

要改变用于布尔全文搜索的操作符,要设置ft boolean syntax系统变量。这个变量也可以在服务器运行时被改变,但必须有SUPER特权才能这么做。在这种情况下不需要重建索引。

假如改变了影响索引的全文变量(ft_min_word_len、ft max word len或ft stopwordfile)。或假如改变了禁用词文件本身,则必须在改变和重新启动服务器后重建FULLTEXT索引。这时,要重建索引,只需进行一个QUICK修理操作,如下所示。

mysql>REPAIR TABLE tbl name QUICK;

注意,假如使用myisamchk来执行一项修改表索引的操作(诸如修理或分析)。则使用最小单词长度和最大单词长度,以及忽略词的默认全文参数值重建FULLTEXT索引,除非已另外指定。这将导致问询失败。发生这个问题的原因在于只有服务器认识这些参数。它们的存储位置不在MyISAM索引文件中。若已经修改了最小单词长度或最大单词长度或服务器中的忽略词,为避免这个问题,应对mysqld所使用的myisamchk指定同样的ft min wordlen,ft max word len和ft stopword file值。例如,假如已经将最小单词长度设置为3,则可以修改一个带有myisamchk的表,如下所示。

shell>myisamchk——recover——ft_min_word_len=3tbl name.MYI为保证myisamchk及服务器对全文参数使用相同的值,可将每一项都放在供选文件中的[mysqld]和[myisamchk]部分,如下所示。

[mysqld]

ft_min_word_len=3

[myisamchk]

ft_min_word_len=3

使用REPAIR TABLE,ANALYZE TABLE,OPTIMIZE TABLE或ALTER TABLE来代替使用myisamchk。这些语句通过服务器来执行,服务器知道使用哪个全文参数值更加合适。

6.3应用MySQL全文搜索

6.3.1桌面应用

这里,使用Java Swing开发一个桌面应用程序,连接MySQL数据库,执行全文搜索。这个案例只为演示。

只含有一个文件TianenSearch.java,代码如下:

TianenSearch.java

import java.util.*;

import java.io.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

public class TianenSearcher

{

//搜索关键词

static JTextField jtf=null;

//搜索按钮

static JButton jb=null;

//文本区域

static JTextArea jta;

private static void createAndShowGUI()

{

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame=new JFrame("MySQL Searcher!yutianen@163.com");

frame.setDefaultCloseOperation(JFrame.EXIT ONCLOSE);

Container con=frame.getContentPane();

con.setLayout(newBorderLayout());

JPanel jpup=new JPanel();

jpup.setLayout(new GridLayout(1,2));

jtf=new JTextField(30);

jb=new JButton("搜索");

jb.addActionListener

newActionListener()

{

public void actionPerformed(ActionEvent e)

{

String s=jtf.getText().trim();

jta.setText(search(s));

}

}

);

jpup.add(jtf);

jpup.add(jb);

jta=new JTextArea(10,60);

JScrollPane jsp=new JScrollPane(jta);

con.add(jpup,BorderLayout.NORTH);

con.add(jsp,BorderLayout.CENTER);

frame.setSize(200,100);

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args)

{

SwingUtilities.invokeLater

new Runnable()

{

public void run()

{

createAndShowGUI();

}

}

);

}

private static String search(String s)

{

Connection conn=null;

Statement stmt=null;

ResultSet rs=null;

StringBuffer res=new StringBuffer("");

try

{

Class.forName("com.mysql.jdbc.Driver");

}

catch(ClassNotFoundException ce)

{

System.out.println(ce.getMessage());

}

try

{

//获得Connection对象

String url="jdbc:mysql://localhost:3306/tianen";

conn=DriverManager.getConnection(url,"root","tianen");

stmt=conn.createStatement();

String sql="SELECT*FROM en where match(title,body)against(""+s+"")";

rs=stmt.executeQuery(sql);

while(rs.next())

{

res.append(rs.getString("title")+" "+rs.getString("body")+"

");

}

}

catch(SQLException e)

{

System.out.println(e.getMessage());

}

finally

{

if(rs!=null)

{

try

{

rs.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(stmt!=null)

{

try

{

stmt.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

if(conn!=null)

{

try

{

conn.close();

}

catch(SQLException ee)

{

System.out.println(ee.getMessage());

}

}

}

return res.toString();

}

}

同类推荐
  • 引领青少年的100个奇妙环境

    引领青少年的100个奇妙环境

    孩子们都想要知道一些自己不知道的事,也喜欢寻找答案,念书或是探索的行动,也是出自于一种好奇心。所有的儿童书籍里都具有探索的架构,其中探索架构最浓厚的,莫过于神话故事、民间故事以及传说故事,内容包括侦探小说、冒险小说、科幻小说等。
  • 应用文写作教程(修订本)

    应用文写作教程(修订本)

    本书以教育部制定的《高职高专教育基础课程教学基本要求》为指导,以“实用、适用”为特点。全书以应用文的基础理论为指导,例文规范实用,训练循序渐进。而且《全国高职高专教育精品规划教材·应用文写作教程(修订本)》注重理论联系实际,通过学习,学生可深入地了解各类应用文的特点和写作常识,逐步把书本知识转化为实际技能。
  • 手术室护理学

    手术室护理学

    本书广泛收集国内外近期文献,认真总结经验,共分十三章介绍手术室护理医学,如手术室工作流程、各项管理制度、常用护理技术、手术中的无菌操作、手术体位、麻醉的护理、围手术期病人的护理、常见手术的护理、手术室护理人员职业暴露危险与防护等方方面面的护理知识和技术。
  • 交通工具全知道

    交通工具全知道

    本书主要从陆上交通工具、水上交通工具、空中交通工具和交通设施四个方面详尽地介绍了有史以来的种种交通工具。
  • 中华典故故事全集——爱国为民的故事

    中华典故故事全集——爱国为民的故事

    本套《中华典故故事全集》全部精选我国著名典故故事,并根据具体思想内涵进行相应归类,主要包括《爱国为民的故事》、《军事战争的故事》、《修身立世的故事》、《智慧谋略的故事》、《读书学习的故事》、《品质修养的故事》、《社会世情的故事》、《世事明察的故事》、《心灵情感的故事》和《悟道明理的故事》等十册,书中每个典故都包括诠释、出处和故事等内容,简单明了,短小精悍,具有很强的启迪性、智慧性和内涵性,非常适合青少年用于话题作文的论据,也对青少年的人生成长以及知识增长具有重要的作用,是青少年阅读和收藏的良好版本。
热门推荐
  • 风水大相师

    风水大相师

    养气、观气、定气、乘气、修气、问气,风水相师的六大境界!华夏九鼎守护家族、风水世家传人苏九,因为意外得到上古金色罗盘,从此走上了一条解密千年谜团之路。十指算生死,风水点富贵、六卜算尽天下事,八卦测遍世间人!看苏九解开种种谜团,掀开风水这一传承千古的文化。PS1;VIP书友群:498535691(需要全订阅粉丝值。)PS3;新书已经发布,拜求支持!
  • 医武高手

    医武高手

    陈飞,三千年来,唯一以医入圣的医仙,为了追随爱人的脚步,入了轮回,意外的成为了江家上门女婿。而且还是那种专门背黑锅的倒霉女婿……只不过,在陈飞觉醒的那一刻……一切,全变了!这世上,还有谁敢欺我,辱我?
  • 敬业工作为了谁:敬业才能有事业

    敬业工作为了谁:敬业才能有事业

    敬业可以改变命运,敬业的人总是能够获得成功,因为敬业工作可以提高能力,造就品牌,这样的人永远都是公司的核心人物,永远能够在平凡的岗位上创造不平凡的价值。本书共十章节,内容包括敬业工作为了谁、尊敬工作,你才能成为工作的拥有者、敬业是一种觉悟,让敬业沉淀到人格中、敬业改变态度,成功从敬业开始等。
  • 万世龙尊一

    万世龙尊一

    一介天才,却不知为何,沦为废材,受人欺负,又能否重新爬起,挥手之间毁灭洪荒的师父,一个实力深不可测的少女他们等人,又会创造出怎样的传奇故事?
  • 牟宗三说儒

    牟宗三说儒

    牟宗三先生终生不做官,不取财,不搞华而不实。对于平凡的世界,他更强调不平凡的人生学问,“这学问不为自己,专为我们中国文化做一点点贡献。”在这位最具“原创性”的“智者型”哲学家,当代港台新儒家中的重镇身上,我们能够看到一个儒者的真情真性与一份儒家的生命力量。
  • 穿越之带着空间闯异世

    穿越之带着空间闯异世

    父母遭受意外,留下传家宝一枚,男友被爸爸领养的妹妹抢走,原来这些年只是为了钱。认为自己人缘不好,不料,这却是一个阴谋,为了夺取财产,不惜抛弃亲情,为了金钱,可以不顾爱情“呵!”某君冷笑“既然你们不念亲(爱)情,那就别怪我不客气了!”……什么!传家宝是一个空间?!可种田,可修仙?!什么!我的父母还没死?!某君狂笑“哈哈哈哈……老天待我不薄啊!”完成复仇,却不料一遭穿越到古代……找到爸妈后本想过着自己的悠闲小日子,却偏有人不让她如意……这是花花的第一本小说哦~大家多多支持O(∩_∩)O~
  • 载心问道

    载心问道

    天地茫茫独一人,黑云低压寂无声。世间万人皆言魔,浪迹天涯自洒脱。穷极轮转难自弃,一线生机开天门。回首来时无根路,黄粱一梦归人间。这是一个一无所有的人找到自己责任和归属的故事,也是一个游子在苍茫中寻求自我的解脱。PS:只有小孩子才做选择,萌新全都要,各位看官大佬有空加加收藏,无聊点点推荐,常来评论评论,欢迎指出不足和缺点,有则改之无则加勉,谢谢啦啦啦啦啦~
  • 重生之妈咪想赖账

    重生之妈咪想赖账

    叶安静,女,爱好男,人生梦想是坐拥美男。却不想时运不济,隔天碰着个追杀,改明儿有碰着个穿越,最后还被某人拐回了家。-————————————新文求收藏《这届情敌不好带》小剧场请各位小天使笑纳:【某次,于小姐直播】弹幕:然爷,六哥到底怎么了鸭!再不出现我就爬墙男二了!某然:快了快了,六哥去打个副本就回来谈恋爱。弹幕:说起恋爱就是这么开始的,某然,你是不是真的脱单了?某然冷漠脸:不可能,我没有男朋友。——手机背后的容先生脸色渐渐沉了下去——弹幕:最近绯闻满天飞,那照片太真实了吧,说,你是不是在和子貟谈恋爱。某然迅速撇亲关系:我跟你们家容子貟没有任何关系,也不会有关系。紧接着,手机背后的男人冷着脸走立在她旁边:你刚刚说什么?弹幕爆炸:卧槽?????
  • 捡来的弟弟权倾朝野了

    捡来的弟弟权倾朝野了

    一朝穿越,她成了一品柱国将军嫡女。一夜之间将军府被歹徒灭门,那年还未及笄的她建立了第一大杀手逍遥阁。她发现害她将军府一百多条人命的是她捡来的乞丐。一身红衣的她手携长剑站在大雪中”你真当我舍不得杀你?"站在对面的男人“除了她,其他人不留活口”她亲眼看着这个她最爱的男人毁了她一切。
  • 穿书之男主他黑化了

    穿书之男主他黑化了

    穿越到一本小说里,绑定了一个系统,为了能够回家,沈缘初一心想要完成任务,只是每当她做任务的时候,总有猪队友拖她后腿。直到后来,她和男主在一起后,才知道,男主他是重生的,并且,还拥有了一项只针对她的技能——读心,她的马甲,早就在和男主的相处中,被扒得差不多了。