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

}

}

同类推荐
  • 中学化学课程资源丛书-化学之声

    中学化学课程资源丛书-化学之声

    作为科学教育的重要组成部分,新的化学课程倡导从学生素质的培养和社会发展的需要出发,发挥学科自身的优势,将科学探究作为课程改革的突破口,激发学生的主动性和创新意识,促使学生积极主动地去学习,使获得化学知识和技能的过程也成为理解化学、进行科学探究、联系社会生活实际和形成科学价值观的过程。本套丛书集知识性与实用性于一体,是学生在学习化学知识及教师在进行引导的过程中不可或缺的一套实用工具书。
  • 安全健康教育综合读本3.上册

    安全健康教育综合读本3.上册

    安全健康教育综合读本3·上册感冒俗称伤风,是最常见的疾病之一。指的是人体在一定诱发因素作用下,感染上致感冒病毒,从而出现鼻塞、流涕、咽痛、咳嗽、发热等症状。普通感冒潜伏期短,一天左右,起病较急,一般伴有轻度发热,体温多不超过39℃。常咽痛、头痛、全身乏力,并有鼻塞、喷嚏、流涕、胃不适等,有时有轻度咳嗽,如果无并发症,则多在3~5天症状减轻、消退。全年都会发生,以冬末春初季节较多。
  • 中国高校体育教育研究

    中国高校体育教育研究

    通过对高校体育教学、体育课程、体育资源的合理配置、体育俱乐部等方面的研究,阐述我国高校体育教育的相关问题。
  • 新课标课外快乐阅读丛书——快乐心灵的美德故事

    新课标课外快乐阅读丛书——快乐心灵的美德故事

    快乐阅读,陶冶心灵,这对于提高广大中小学生的阅读写作能力,培养语文素养,促进终身学习等都具有深远的意义。现代中小学生不能只局限于校园和课本,应该广开视野,广长见识,广泛了解博大的世界和社会,不断增加丰富的现代社会知识和世界信息,才能有所精神准备,才能迅速地长大,将来才能够自由地翱翔于世界的蓝天。
  • 学生球类运动学习手册——教你打篮球

    学生球类运动学习手册——教你打篮球

    21世纪,人类进入了新经济时代。综合国力竞争的实质是民族素质的竞争,是人才的竞争,是教育的竞争。在这样的背景下,加强素质教育,尤其是进行身体素质教育就显得更为重要。球类运动是世界上开展的最广泛的运动项目之一,也是广大体育爱好者乐于观赏和参与的体育运动。经常进行此类运动,不仅可以增强人们的体质,提升身体的协调性,而且还能增强我们的自信心以及培养团队精神。
热门推荐
  • 异灵师

    异灵师

    有时候,一个种族的灭亡不是因为它的弱小,恰恰相反也许是因为它们太过于强大了。在一千年以前,有一个强大的种族,他们一出生就具有破万法,辨鬼神的能力,寿命也可达千年之久。这个种族人们把他们称之为异灵师。强大的能力和长久寿命的完美结合并没有使这个种族发展壮大,反而人数始终只有寥寥数千人,究竟是什么原因让他们未能壮大起来?并且在千年前,这个种族突然在一夜之间神秘的消失,这又是为什么。他们现在是否还存在世上?现在他们又在哪?
  • 我爱路过

    我爱路过

    谁甘当配角?如果不能做你的主角,我宁愿只是一个过客。
  • 永远过不了的界限

    永远过不了的界限

    相爱一场,原来不过是欺骗自己,最后还不是各走各的吗?对吧!也许,注定不能相爱了呢!
  • 修行都市

    修行都市

    当我从梦中醒来的时候,这世界上的一切,对我来说,都变了……
  • 森林深处的隐者

    森林深处的隐者

    孤苦老人为何时常遭受恶贼的欺压?甜蜜情侣为何深夜惨遭烈火焚烧?中年大妈晾晒的内衣为何频频失踪?一年为何多出了第十三个月?杀马特团体为何神秘失踪?美少女为何夜晚不能出门······这是人性的扭曲,还是道德的沦丧,一切真相尽在《森林深处的隐者》——凶兽、魔兽、灵兽、神兽等等等等兽类,也如同人类一般建立了强大的国度,在俨如金字塔存在的兽族森林深处,传说之中生活着一位不世出的隐者。这位隐者据说曾经是人类历史中的某位先贤,开创了一段崭新而璀璨的文明······
  • 天绝战记

    天绝战记

    们的世界中,隐藏着神魔两族,他们互相厮杀着,人类在他们眼中不只过是一只只藐小脆弱的存在,在两方伤亡惨重之时,人类又成为了他们的棋子一般被她们所操控,直到神魔之子的降临,让这无止尽的纷争再一次的拉开,他会留下一个怎样的传奇,他将会怎样面对这万恶的世界。
  • 绝恋:我是冷酷公主我怕谁

    绝恋:我是冷酷公主我怕谁

    “敢打赌吗?长大之后谁先喜欢对方,谁就要答应对方一个要求!!”“打赌就打赌,还怕你不成?”为了15年前的赌约,宇文泽,世界第一集团的继承人,破天荒的请求老爹老妈把诺影骗到圣丽丝学院,只为心中恋恋不忘的倩影的一声“我喜欢你!”一步步,让南宫诺影卸下冷酷的面具。黄昏下,一个小小的身影羞红着小脸,吞吞吐吐终于说完一句“我喜欢你!”面前的人哈哈大笑,说我赢了,不料面前的身影微微一转,附上小唇,面带微笑说了一句“是我赢了!”
  • 晨缘隽世

    晨缘隽世

    这是学生时代,是异能的天地,是游戏的天堂,是混杂的世界。风云物变,看我饮酒摔罐,劈天堑,掌长虹;黑暗苍穹,予我百丈长缨,罢乾坤,斩黄龙;混沌山河,容我坐镇千里,逼长空,战八方。
  • 爱上我的女保镖

    爱上我的女保镖

    她是黑道的神秘组织暗夜的一员,他是天狼集团的少东,为了保护他,她女扮男装潜入男校,他的心从此为她开启。女保镖与天之骄子,白道与黑道的爱情就像罂粟一样,即使痛苦也离不开。--情节虚构,请勿模仿
  • 冷冷的微笑

    冷冷的微笑

    她,白天是医院的天使,夜晚却变成了比撒旦可怕的恶魔,一次意外失手,她竟穿越了,上帝还真会跟她开玩笑,他,一国之君,却被一个冷若冰霜的女人赏了一个响亮的嘴巴子,该死,冷对冷的决战,谁会先被沦陷,原来爱比恨更难宽恕,宽恕是否能阻止一场浩劫?