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

}

}

同类推荐
  • 组织心理与行为管理概论

    组织心理与行为管理概论

    以人为本,促进个人价值的最大化发挥是实现组织持续创新的关键。本书从人是管理的核心入手,紧紧围绕着工作环境中的员工,循序渐进地以个体、群体和组织三个层次展开对人及人与环境的互动中产生的心理与行为进行剖析和探讨。本书根据心理学理论提供了实效性的训练,将工作情景中的管理者与员工的内隐心理与外显行为改善有机结合为一体,以创造创新型组织。本书的重要特色在于全面考虑组织中人的各类心理表现,既从管理学的视角来揭示心理预测行为,又从心理学的视角阐述人的心理微妙变化以及在组织和群体中的心理与个体心理表现的不同,是从管理学和心理学两个角度来阐述心理与行为的。
  • 鲁滨逊漂流记(彩绘版)

    鲁滨逊漂流记(彩绘版)

    从小就向往航海的鲁滨逊背着自己的家人,踏上了航海旅程。经历了几次海难后,他在巴西拥有了一份家产,不打算航海了。但没过多久他经不起诱惑,再次出海.在一场暴风雨中,船失事了,仅有他一人生还,游到了一座无人岛上活了下来。故事最精彩之处就是鲁滨逊在荒岛上的生活:建城堡、种粮食、造船、养羊……后来,他还找到了一个仆人。他在荒岛上生活了二十多年,才和一位船长回到了英国,然而,物是人非……
  • 学校餐饮五常现场管理

    学校餐饮五常现场管理

    学校是一个人员较为聚集的场所,学校餐饮食品安全直接关系到师生的身体健康和校园的和谐稳定,并且一直被政府、社会各界广为关注。规范学校餐饮管理,确保学校食品安全,是学生健康成长、家庭幸福、校园稳定、构建和谐社会的重要内容。
  • 影响青少年一生的中华典故——勤俭故事

    影响青少年一生的中华典故——勤俭故事

    《勤俭故事》每个典故包括诠释、出处和故事等内容,简单明了,短小精炼,具有很强的启迪性、智慧性和内涵性,非常适合青少年用于话题作文的论据,也对青少年的人生成长以及知识增长具有重要的作用。
  • 新课程师资培训教程-高二生物优秀课例

    新课程师资培训教程-高二生物优秀课例

    为新课程实施和提高教师专业化水平而精心编写,选取了大量教案,内容上充分体现了知识性和趣味性。接受课改新理念,感受课改新思维,使用课改新教材,至始至终课改给人一种焕然一新的感觉。它是一次革命,一场对话,一座平台,一把迈向成功教育的钥匙。
热门推荐
  • 通往你的路

    通往你的路

    他以为,大理车站是初遇。她双眸剪水,冷艳卓然;他居高临下,毒舌挑逗。彼此吸引,这本应是旅程中一次不错的“艳遇”。然而,两人的命运线早在多年前便纠缠在一起。十七年前,两个女孩身陷绝境,他选择舍弃她,多年来,却从未放弃寻找。相逢后,两不相识。却不知,早已陷入一场追逐游戏。
  • 剑初

    剑初

    善恶谁能定,正义在我心。以我凡人之躯,偏要破那神魔之意。以我凡尘之心,偏要证这苍穹之力。待我剑入太初,定要神佛烟消云散。一个惊天阴谋,一条没有选择的路道长生,创世路,煮酒当歌,不老红颜笑。问苍生谁主浮沉,当世男儿剑指苍穹。
  • 终极天神

    终极天神

    大家好,我叫王胜,一生最喜欢的课程是数学,于我一欢幻想所以无意间想起了写小说,也就是《终极天神》,希望大家捧场!谢谢!
  • 轮回之剑御天下

    轮回之剑御天下

    身处剑修世家却不能习剑系出名门之后却被家族放逐在外,尝尽辛酸百花谷下的倾情回眸,明月溪旁的真情相伴滂沱山中的飞身挡剑,束龙涧的香消玉殒心中的痛纵百死不得回肠,惜万世无法平殇百花落,星辰陨万物坠散,束龙涧执轮回,掌天下是千年的生死轮回,还是命运的无奈安排逆天而行,只为爱寻一道看得见的曙光背道而驰,只为生找一处摸得到的安逸
  • 最后的证据

    最后的证据

    选自希区柯克短篇故事集,包括《最后的证据》《珠宝设计师》《副经理的秘密》等十余篇短篇小说,文字简洁平实,情节曲折跌宕,结局却出人意料,并且往往让读者有一种身临其境的感觉。小说具有较高的可读性,富于现代特点,符合当下阅读习惯及阅读趋向,颇受年青一代欢迎。
  • 诸天死神

    诸天死神

    失恋的枫烯得到死亡冥玉开启了一条穿越诸天的故事……
  • TFBOYS之浪漫烟火

    TFBOYS之浪漫烟火

    TFBOYS在一次偶然的事件遇到了三位女孩,她们用她们的善良打动了三小只,接下来会发生什么请看正文
  • 专情独宠:霸少的专属萌妻

    专情独宠:霸少的专属萌妻

    第一次见面让她现在想起来都那么尴尬至极,偏偏自己又被逼着做自己不喜欢做的事情,就为了得到钱。“下贱的女人,你不就是需要钱么?”他冰眸中的冷光折射在她身上,夏清浅身体一颤,低头,咬唇,一声不吭。她越是这么沉默,越是激起了他的愤怒,冰冷的手指仅仅钳住她的下颌,迫使她抬起头正对着自己的脸:“我在和你说话!”她真的不想生活在这里,不想生活在他的阴影下,可是为了爸爸,为了妈妈,自己不得不贡献自己,她的记忆力还有她爱的人,可是殊不知,那个人早已远去……
  • 青春纪末

    青春纪末

    本书描写了一群年轻充满朝气的90一代的亲情,友情,爱情。我们或许可以从中找到自己的影子……写作本书是为了给自己的青春留个纪念,那些我们不断提及的青春,那些我们共同经历的青春,那些属于你也属于我的梦幻般的青春,也许有一天当我们共同怀念起来的时候可以从故事中回到那些阳光明媚的日子,回到那段被我们一再提及,一再想念的时光。写给那些热爱青春的人,在未来的日子里我们总会长大……欢迎大家支持《青春纪末》,下面是链接http://novel.hongxiu.com/a/118878/如果喜欢,一定要记住这个地址哦O(∩_∩)O~
  • 忆宵晓

    忆宵晓

    梁晓不知道哪个自己是真的。不知道他如今在哪儿,不知道他还是否再找她。