大型网站架构设计-Lucene 的使用 高亮和中文分词

2014-12-29 17:01:57     24 人阅读    

高亮

查询到匹配的文档后,需要对匹配的内容进行突出展现,最直接的方式就是对匹配的内容 高亮显示。对于搜索list来说,由于文档的内容可能比较长,为了控制展示效果,还需要对文 档的内容进行摘要,提取相关度最高的内容进行展现,Lucene都能够很好地满足这些需求:

Form^atter form^atter = new SimpleHTMLForm^atter(n<font color=,red,>n,n</font>n); 

Scorer scorer = new QueryScorer(query);
Highlighter highLight = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(20); 

highLight.setTextFragmenter(fragmenter);


       通过构建高亮的Formatter来指定高亮的HTML前缀和HTML后缀,这里用的是font标签。 查询短语在被分词后构建一个QueryScorer,QueryScorer中包含需要高亮显示的关键字, Fragmenter则用来对较长的Field内容进行摘要,提取相关度较大的内容,参数20表示截取前 20个字符进行展现。构建一个Highlighter,用来对Document的指定Field进行高亮格式化:

String hi = highLight.getBestFragment(analyzer, "introduce", doc.get ("introduce"));


查询命中相应的Document后,通过构建的Highlighter,对Document指定的Field进行高
亮格式化,并且对相关度最大的一块内容进行摘要,得到摘要内容。假设对dog进行搜索, introduce中如包含有dog,那么使用Highlighter高亮并摘要后的内容如下:
introduce : i am a <font color=,red'>dog</font>fmy name


中文分词
            Lucene提供的标准中文分词器StandardAnalyzer只能够进行简单的一元分词,一元分词以 一个字为单位进行语义切分,这种本来为西文所设计的分词器,用于中文的分词时经常会出现 语义不准确的情况。可以通过使用一些其他中文分词器来避免这种情况,常用的中文分词器包 括Lucene自带的中日韩文分词器CJKAnalyzer,国内也有一些开源的中文分词器,包括IK分 词、MM分词,以及庖丁分词、imdict分词器等。假设有下面一段文字:
String zhContent ="我是一个中国人,我热爱我的国家";
分词之后,通过下面一段代码可以将分词的结果打印输出:

System. out.println("\n 分词器:"+ analyze.getClass());
TokenStream tokenStream = analyze.tokenStrea^("content", new StringReader(text)); Token token = tokenStream.next(); while(token != null){
System.out.println(token); token = tokenStream.next();
}


通过StandardAnalyzer分词得到的分词结果如下:
Analyzer standarAnalyzer = new StandardAnalyzer(Version. LUCEME—OT邱册r);
分词器:class org. apache. lucene. analysis . standard. StandardAnalyzer

[我f 0,1, type=<CJ>>
【是『1,2, type=<CJ>>
(_,2,3, type=<CJ>)
(个 r 3,4, type=<CJ>>
【中,4,5 type=<CJ>)
(IS, 5, 6, type=<CJ>)
[Ar 6,7f type=<CJ>)
[我f 8,9, type=<CJ>>
(热,9,10,type=<CJ>>
(爱,10r 11, type=<CJ>)
(我r ll,12,type=<CJ>)
(的,12,13, type=<C J>)
(IS, 13r14f type=<CJ»
(豕 r 14,15, type=<CJ>)


由此可以得知,StandardAnalyzer采用的是一元分词,即字符串以一个字为单位进行切割。 使用CJKAnalyzer分词器进行分词,得到的结果如下:
Analyzer cjkAnalyzer = new CJKAnalyzer();
通过分词的结果可以看到,CJKAnalyzer采用的是二元分词,即字符串以两个字为单位进 行切割。
使用开源的IK分词的效果如下:
Analyzer ikAnalyzer = new IKAnalyzer()
可以看到,分词的效果比单纯的一元或者二元分词要好很多。 使用MM分词器分词的效果如下:
Analyzer mmAnalyzer

本文出自   《大型分布式网站架构设计与实践试读样章》 试读,如果感觉到对你有帮助可以去购买该书


原文地址:http://www.itmmd.com/201412/408.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

linux命令详解(24)将文本文件转换成不同的格式,dos2unix,unix2dos命令详解   上一篇
下一篇  产品经理学习笔记(16)-产品运营常用的工具

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!