`
tigers20010
  • 浏览: 47560 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2010-01-05 传智播客—luncene/compass (转载)

阅读更多

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。

                                                                                                                                                                                                                                                                                               ————tigers20010

北京好奇怪,昼夜温差很大,有点像月球。早起时窗上的冰霜很厚实,但到了白天阳光很足,风力很小,气温很好。大连现在确在降温,零下十几度,比较罕见。可能是我离开她一会,她却变冷了。呵呵~~

 

今日上午把lucene的高级部分给结束了。下午搞了一下CompassCompass是对lucene的封闭。因为lucene使用起来有些麻烦。

 

一、lucene高级

1.分词器

一般的分词器流程:

 
 
 

 


1)         输入文本:输入查询的内容。

2)         关键词切分:使用分词器取出关键词。

3)         去除停用词:去除没有多大意义的词,比如a,an,the,的,呢,吧。

4)         形态还原:将词的某种形态还原为原形,比如英文复数形式恢复到单数形式。

5)         转为小写:将英文转为小写,不区分大小写。

 

Lucene中的分词器

1)         单字分词:对应的类ChineseAnalyzer,将输入的字符串中的每个字做为关键字。比如“中国人加油!”,会被切分为“中”、“国”、“人”、“加”、“油”。(标点符号属于停用词)

2)         二分法分词:对应的类CJKAnalyzer,将输入的字符串以二分法分词。比如“中国人加油!”,会被切分为“中国”、“国人”、“人加”、“加油”这四个关键字。(标点符号属于停用词)

3)         词库分词:对应的类MMAnalyzer最为常用的分词器。比如“中国人加油!”,会被切分为“中国人”、“加油”。(标点符号属于停用词)

示例:

package cn.itcast.cc.anayzler;

 

import java.io.IOException;

import java.io.StringReader;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.Token;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;

import org.apache.lucene.analysis.cn.ChineseAnalyzer;

import org.junit.Test;

 

public class AnalyzerTest {

 

    Analyzer anaylzer1 = new ChineseAnalyzer();// 单字分词

    Analyzer anaylzer2 = new CJKAnalyzer();// 二分分词法

    Analyzer anaylzer3 = new MMAnalyzer();// 词库分词

 

    @Test

    public void test() throws IOException {

        String str = "中国人加油!";

        printAnalyzer(anaylzer1, str);

        printAnalyzer(anaylzer2, str);

        printAnalyzer(anaylzer3, str);

    }

 

    private void printAnalyzer(Analyzer analyzer, String str)

            throws IOException {

        TokenStream tokenStream = analyzer.tokenStream("text", new StringReader(

                str));

        System.out.println("*****分词器->" + analyzer.getClass().getName() + ",将'"

                + str + "'切分为:");

        Token token = new Token();

        while ((token = tokenStream.next(token)) != null) {

            System.out.println(token);

        }

    }

}

 

2.高亮

Lucene的高亮器(Highlighter类)可以实现lucene的关键字高亮:

package cn.itcast.cc.highlighter;

 

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.document.*;

import org.apache.lucene.document.Field.*;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriter.MaxFieldLength;

import org.apache.lucene.queryParser.*;

import org.apache.lucene.search.*;

import org.apache.lucene.search.highlight.*;

import org.apache.lucene.search.highlight.Scorer;

import org.junit.Test;

import jeasy.analysis.MMAnalyzer;

 

public class HighLighterTesst {

    private String path = "./index/";// lucene的索引数据被保存在这个目录中

    private Analyzer analyzer = new MMAnalyzer();// 词库分词器

 

    @Test

    public void test() {

        try {

            // 创建索引数据

            IndexWriter indexWriter = new IndexWriter(this.path, this.analyzer,

                    MaxFieldLength.LIMITED);

            Document doc = new Document();

            doc.add(new Field("content", "中国人民加油!", Store.YES, Index.ANALYZED));

            indexWriter.addDocument(doc);

            indexWriter.close();

            // 查询数据

            IndexSearcher indexSearcher = new IndexSearcher(this.path);

            QueryParser queryParser = new MultiFieldQueryParser(

                    new String[] { "content" }, this.analyzer);

            Query query = queryParser.parse("加油");

            TopDocs topDocs = indexSearcher.search(query, null, 10);

            // 创建高亮

            // SimpleHTMLFormatter的默认值为"<a></a>"

            Formatter formatter = new SimpleHTMLFormatter("<span>", "</span>");

            Scorer scorer = new QueryScorer(query);

            Highlighter highlighter = new Highlighter(formatter, scorer);

            // 打印结果

            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {

                // 取出查询结果

                Document searchdoc = indexSearcher.doc(scoreDoc.doc);

                String searchstr = searchdoc.getField("content").stringValue();

                // 添加高亮

                String histr = highlighter.getBestFragment(this.analyzer,

                        "content", searchstr);

                System.out.println(histr);

            }

            indexSearcher.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics