登陆注册
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();

}

}

同类推荐
  • 大学生安全教育

    大学生安全教育

    大学是传播和延续人类文明的神圣殿堂,是青年学生求学、求知、全面发展的广阔天地。大学时代是人一生中生命力最为旺盛、思维和社会活动最为活跃的时期,校园里随处可见莘莘学子洋溢着青春活力的身影;同时,大学时代也是青年学生生理与心理、个人与他人、理智与情感、专业学习与素质拓展等各种矛盾最集中的阶段,所以,充沛能量的释放矛盾交织的事物和跌宕情感的起伏也不时冲击着校园生活静静的堤岸。朝气蓬勃、多姿多彩的大学校园毕竟不是“世外桃源”,在开放包容、宽松多样、鼓励竞争和国际化加快的环境下办学,学校和学生与现实社会无时无刻不发生着各种各样的联系,在静谧和欢乐的校园中也存在着学生必须时刻关注的许多安全问题。
  • 启迪青少年的语文故事集——青少年应知唐诗名句的故事

    启迪青少年的语文故事集——青少年应知唐诗名句的故事

    启迪青少年的语文故事集——青少年应知唐诗名句的故事启迪青少年的语文故事集——青少年应知唐诗名句的故事
  • 医学概论

    医学概论

    本书在总结多年教学经验的基础上,结合医学生的素质教育的需要分16章,主要介绍了医学发展过程、发展趋势及人才培养现状。同时,从人文教育的角度,阐述了如何激发学生学习医学的兴趣与刻苦学习的决心,以及培养良好的人文素养与情怀。
  • 科学读本(英文原版)(第5册)

    科学读本(英文原版)(第5册)

    以一位名为威尔逊的教授与3位学生为主角,通过对各种事物与科学知识和原理的讨论,系统讲述了孩子们身边随时可见的事物与现象原理。以激发孩子们对科学的兴趣与爱好。这比死记知识,大量解题要实用得多。《科学读本(英文原版)(套装共6册)》对中国学生而言,这又是另一习得英语的良好途径,尤其对那些准备出国学习的孩子们,《科学读本》的阅读学习,对他们继续国外课程的学业定有很大帮助。比起文学与文史题材的英语读本,科学英语更容易让孩子们理解与学习。一是其讲述内容均为我们身边熟悉的万事万物,容易联想记忆;二是科技英语的语法、句子结构相对简单,比文学语言更简洁清晰,易于理解。相信会得到孩子们的喜欢。
  • 爱上写日记.小学一、二年级

    爱上写日记.小学一、二年级

    日记为孩子的心理健康和心灵成长提供了个人空间。小学生从小养成写日记的好习惯,对于开拓眼界和提高作文水平有很大的帮助。本书指导小学一二级学生真实地记录学习和生活中的事情、感想和见闻,锻炼写作能力,并对成长中的烦恼提供心理上的帮助。
热门推荐
  • 石碑记

    石碑记

    万历十七年,九州界,雷州,一个偏僻的小王国,正在惨遭徐大石的剥削和压迫,于是,九州界史上最大的一颗老鼠屎诞生了!“道友,要不你再好好摸摸,真没有了么?”徐大石一脸狐疑的看着前方的小老头。“大石道友,真没了,小老儿全身就剩下了这一条遮羞裤了啊。”面前一小老儿紧紧的拽着仅剩的一条裤衩,悲愤的看着徐大石,快哭了。
  • 与三只的邂逅

    与三只的邂逅

    我或许就是一个错误,直到遇见了他们………………
  • 慕先生的于小姐

    慕先生的于小姐

    一个明星和总统的故事!只需一眼,便能改变一生!她在大学里遇到他,之后便一系例的事,因此找到身世,进入演艺圈,让她成为全尊贵的女人。
  • 邪魅杀手:王爷快滚开

    邪魅杀手:王爷快滚开

    “老婆~要亲亲~”一个邪魅男子的声音从远处传来。“滚”清冷的声音接着传来。异世魂魄,穿越古代,又将擦出怎样的火花?
  • 礼仪金说7:外事礼仪

    礼仪金说7:外事礼仪

    孔子有道:“礼者,敬人。”所谓外事礼仪,即人们在其涉外交往中用以维护自尊,并用以尊重其交往对象的一系列的行为规范。依照中国古代典籍《素书》的说法:“礼者,人之所履。不安于理,便多乖违之象,故以安礼结之。治身、治家、治智,舍此不可。”
  • 好男孩是炼出来的

    好男孩是炼出来的

    本书共分十章,以男孩要炼着养为贯穿全书的主线,分别从培养男子汉气质、“穷”养男孩更出息、承受挫折的能力、炼出责任感、培养独立意识、炼出自控力、培养为人处世的能力等方面入手,为天下父母在培养男孩方面提供了许多有益建议。
  • 古画情劫:糊涂皇妃跑错门

    古画情劫:糊涂皇妃跑错门

    苏蒹葭,二十一世纪新女性,带着一颗被爱人捂得暖暖的心,竟然荒唐的穿越了。来古代的第一晚,糊里糊涂的与一个陌生男子共揽一夜。那男子迷人的琥珀色眼眸凝视着她,薄而优美的唇角微微翘起,低声说道:“我是赢扶梓,你是谁,无论你是谁,我都不想让你离开了。”再次见面时,她已成了他的皇嫂。
  • 火极尊者

    火极尊者

    魔通大陆中有一个让人又恨又慕的传奇人物,他,有时痴呆如孢子,有时暴躁如魔君,有时天真如孩童;有人说,他是一个无情者,对于自己家族,仅因母亲的一句话而亲手泯灭;有人说,他是一个决策者,仅因若溪的一滴眼泪而淡然毁灭一个帝国;有人说,他是一个杀戮者,一日之间残杀数以百万计的人;有人说,他是一个柔情者,数年慕望只为一朝伊人回眸。
  • 婚然心动:腹黑前夫追妻101次

    婚然心动:腹黑前夫追妻101次

    “老婆,我想你了。”某男子一脸发春的样子趴在床上,“滚。”某女子怒了,一个飞踢过来,某男子华丽的躺在了地上。“老婆,你的睡衣露了。”某男子的爪子飞快的袭来,却被她张口咬了。某男子炸了。“老婆,你是狗吗?”女子一脸笑意的说道:“嗯啊,嫁狗随狗嘛,这我懂。”江御泽鄙视的看着她。“老公,你最近很无聊?”某女问。“不不不,每天逗弄老婆可是很累的。”某男子一手撑脑袋,满脸的无害的说道。夏漓怒了,却转而妖娆一笑,“老公,好玩吗?嗯?”江御泽有点懵,木纳的点了点头!某女子蹲下身,白嫩的手抚摸着他的脸:,“其实,离婚也挺好玩的,三婚的感觉也不错,你说是吧。”某女子说完,江御泽就跳了起来,“夏漓,你狠。”
  • 秘密不能说

    秘密不能说

    S市发生一起离奇命案,起初以为是自杀案却因为法医的解剖报告不得改变这个想法。案发现场房门紧闭,屋内没有任何打斗痕迹,但死因竟然是突发性心脏病,而死者家族并未有心脏病病史,法医解剖时发现死者心脏处凸起一个小肉球,此肉球像极了一个女人的脸。这让众人面面相觑,不由自主想起一年前发生的一桩意外身亡案,当时死者也是死于突发性心脏病,经法医解剖发现其心脏同样凸起一个类似女人模样的小肉球,虽然现场凌乱但由于死者有心脏病的病史,警方就此以意外身亡来定案。虽然一起是命案一起是意外身亡案,但是心脏部位凸起类似女人模样的肉球惹得警官叶子浩的注意,随即申请调查此案,并把两案归为一起连环杀人案来处理。却因此发现两年前一起自杀案与此案有所牵连,案件走入死角时,又一起命案出现,同样的突发性心脏病解剖后发现心脏凸出一个类似女人脸的肉球,究竟这其中有什么隐蔽的事情还未被发现,死亡的背后又是怎样的一番孰是孰非呢?