登陆注册
19122000000028

第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();

}

}

同类推荐
  • 语文新课标课外必读第七辑——绿光

    语文新课标课外必读第七辑——绿光

    国家教育部颁布了最新《语文课程标准》,统称新课标,对中、小学语文教学指定了阅读书目,对阅读的数量、内容、质量以及速度都提出了明确的要求,这对于提高学生的阅读能力,培养语文素养,陶冶情操,促进学生终身学习和终身可持续发展,对于提高广大人民的文学素养具有极大的意义。
  • 行政法学

    行政法学

    提高行政机关和国家公务员的依法行政水平,坚持依法行政、从严治政,是建设社会主义法治国家的关键。本书针对我国政府公共管理的需要,侧重从行政管理的角度,系统阐述行政法学的基本概念、原则,重点分析行政主体规范、行政行为规范、行政救济规范和监督行政规范等四方面内容,使读者阅读后能对行政法学的各项基本概念和原理,诸如行政主体、行政行为、行政立法、行政程序、行政复议、行政诉讼等内容及其发展,有比较全面的了解。本书既可作为酝孕粤学位课程的专用教材,亦适合作为行政管理学及法学专业的本、专科基本教材。
  • 中国当代音乐(1949-1989)

    中国当代音乐(1949-1989)

    了解这本著作既总结了当代中国丰富的音乐成就,也总结了深刻的历史教训,是学习当代中国音乐史的很好的教材。读者对象包括:全国各音乐院校、师范院校音乐专业的师生以及广大音乐爱好者。
  • 高等职业教育科学发展

    高等职业教育科学发展

    近年来我国高等职业教育快速发展,规模持续扩大,改革不断深入,质量不断提高,整个事业呈现欣欣向荣的局面,进入了历史上最好的发展时期。2007年,全国高等职业院校共招生283万人,在校学生861万人,约占普通高等院校招生和在校生的一半,占据了高等教育的半壁河山。在扩大招生规模的同时,高等职业教育的管理体制、运行机制和模式改革也取得了显著进展,质量逐步提高,较好地满足了经济社会发展和人民群众的需求。高等职业教育的快速发展,推动了高等教育结构的调整,促进了高等教育各类教育的协调发展,为中国经济社会持续健康快速发展提供了有力的支持,在全面建设小康社会和推进社会主义和谐方面发挥了十分重要的作用。
  • 阅读中华国粹-青少年应该知道的-古代书院

    阅读中华国粹-青少年应该知道的-古代书院

    中华民族在漫长的发展历程中,依靠勤劳的素质和智慧的力量,创造了灿拦的文化,从文学到艺术,从技艺到科学,创造出数不尽的文明成果。国粹具有鲜明的民族特色,显示出中华民族独特的艺术渊源以及技艺发展轨迹,这些都是民族智慧的结晶。《阅读中华国粹》丛书囊括古今,泛揽百科,不仅有相当的学术资料含量,而且有吸引人的艺术创作风味,是中华传统文化的经典之作。王培编著的《青少年应该知道的古代书院》便是此丛书中译本。
热门推荐
  • 古界临兵之斗者

    古界临兵之斗者

    一个少年,拥有三种体魄,称霸古界,在回首,一片红尘.....
  • 总要学着说再见

    总要学着说再见

    客厅和厨房隔着一堵墙,隔着我和夏悠悠,隔着我和夏悠悠的这几年。我开了电脑,看了她喜欢看的电影。那是王家卫的电影,重庆森林。如果我有一张船票,你会不会和我一起走?这句台词我很喜欢,夏悠悠也很喜欢,不过那部电影的名字不是重庆森林,是梁和张的花样年华。虽然导演是一个人,说的却是两个人的故事。
  • 战龙灵

    战龙灵

    在这个充满灵力的世界,一名少年从天才到废物,从废物到天才,经历无数困难,终于站在世界巅峰,
  • 爷的宝贝:腹黑王爷萌宠妃

    爷的宝贝:腹黑王爷萌宠妃

    【正文+番外全部完结】【一对一宠文】叶轻尘发誓,这是她睡过最舒服的一张床,摸上去又滑又腻,还有弹性!神马!弹性?睡眼惺忪反手向回摸去。就在这时——带着压抑黯哑的声音响起:“你再摸下试试!”“啊!”叶轻尘倏地睁开双眸,目瞪口呆的看着身下的男人。她怎么就压了这个最惹不起的男人!*推荐小夭完结宠文:《宠妃逆袭:腹黑王爷溺宠妻》推荐小夭女强宠文:《盛宠医妃:狐狸王爷腹黑妻》群号:夭里妖气214091753喜欢的可以加进来玩哦~
  • 异世基因掠夺者

    异世基因掠夺者

    尤格,一个天生基因缺陷的人,一个天生就短命的人,在神农架考察中,阴差阳错下激活了一个远古传送阵,来到了一个陌生的大陆。这个大陆,有着凶猛的魔兽,神秘的法师,当然也有人类的国度,这里遵循的一个法则就是:丛林法则。尤格刚出了传送阵,就被一头魔龙抓住,准备撕裂,后来,机缘巧合得以幸存,本来基因缺陷的人还融合了跳蚤,绿蚁,红龙的基因,不再是短命鬼,而且还获得了不可思议的能力,但是在这个大陆,他的能力还不能自保,故马上就被别人当作魔兽卖了……
  • 残颜魅妃

    残颜魅妃

    残颜皇贵妃出使博临,竟被妖孽离皇讽刺调戏。果断避开,谁知他却痴缠不放。第一次交锋,他冷酷调戏一亲芳泽,她冷漠有礼,疏离避开。第二次见面,他对她百般折磨千般凌辱,她倔犟不屈,誓死不服。她次次拒绝,他竟越发无情冷酷,她终于忍无可忍:老虎不发威,你当我是HelloKitty--情节虚构,请勿模仿
  • 地府二号首长

    地府二号首长

    穿越异界?身陷地府?仗着一串神奇的手链,王小帅开始潇洒修真。仙佛暗战,蝶翅一扇,造就风华绝代。修心即修真,且随王小帅一起,左右逢源、掌控下界、指点江山,作与仙佛两界平等对话发展的史上第一人。
  • 全能败类

    全能败类

    “钱就是万能的!”“银行卡上的数字和36D就是世界最大的正义!”“贫穷是这世界上最可悲的事!”“贫乳和贫穷一样可悲!”“正义感和奉献精神不会让我感到一丁点幸福,但是,钱可以,懂吗!幼儿园的!”别墅内,这位金钱的奴隶,恶魔的爪牙,却被奉为最强猎杀者的少年,正在无情摧残一个憧憬着世界美好,正义感爆棚的少女的内心世界……少女倔强得看着少年,一语不发,内心默默诅咒着这个败类不得好死。
  • 相爱:公主vs王子

    相爱:公主vs王子

    她,冷漠,她,温柔,她,可爱他,冷酷,他,花心,他,温柔当,冷漠vs冷酷,温柔vs花心,可爱vs温柔又如何呢,她在校园相遇当年不相信自己的哥哥,又一次不相信,又会不会相认呢,请看《复仇:三公主VS三王子》
  • 突发公共事件应急处理法律制度研究

    突发公共事件应急处理法律制度研究

    国家行政学院副院长唐铁汉研究员承担了国家社会科学基金重点项目《中国公共管理的重大理论问题与政府管理创新的对策研究》。应松年教授主编的《突发公共事件应急处理法律制度研究》是其中一个子课题的研究