lucene_IKanalyzer

File file = new File("f://youyajie");
        FSDirectory directory = FSDirectory.open(file);
        //用来创建索引
        IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_36,
                new StandardAnalyzer(Version.LUCENE_36));
        IndexWriter writer = new IndexWriter(directory, conf);

Document doc1 = new Document();

Field f1 = new Field("bookname", "钢铁是怎样炼成的", Store.YES, Index.ANALYZED);

doc1.add(f1);

writer.addDocument(doc1);

writer.close();//一定要关闭writer,这样索引才能写到磁盘上
        
        IndexReader reader = IndexReader.open(directory);
        //简单索引
        IndexSearcher searcher = new IndexSearcher(reader);
        Term t = new Term("bookname", "钢");
        TermQuery quenry = new TermQuery(t);
        //获得得分靠前的两个匹配记录
        ScoreDoc[] docs = searcher.search(quenry, 2).scoreDocs;
        for(int i = 0; i < docs.length; i++) {
            String bookname = searcher.doc(docs[i].doc).get("bookname")
        }
---------------------
作者:youyajie
来源:优快云
原文:https://blog.youkuaiyun.com/youyajie/article/details/7487498
版权声明:本文为博主原创文章,转载请附上博文链接!

java org.apache.lucene.demo.IndexFiles -docs D:\h1.txt

java org.apache.lucene.demo.SearchFiles

Reader  int read(char[] b, int off, int len)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
 
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
  1. 收集待建索引的原文档(Document)
  2. 将原文档传给词条化工具(Tokenizer)进行文本词条化
  3. 将第二步得到的词条(Token)传给语言分析工具(Linguistic modules)进行语言学预处理,得到词项(Term)
  4. 将得到的词项(Term)传给索引组件(Indexer),建立倒排索引

    QueryParser parser = new QueryParser(Version.LUCENE_36, field, analyzer);

    Query query = parser.parse(queryString);

       

Analyzer anal = new IKAnalyzer(true);
        StringReader reader = new StringReader(sentence);
        // 分词
        TokenStream ts = anal.tokenStream("", reader);
        CharTermAttribute term = ts.getAttribute(CharTermAttribute.class);
        // 遍历分词数据
        while (ts.incrementToken()) {
            text += term.toString() + "|";
        }
        reader.close();

Analyzer类是一个抽象类,是所有分析器的基类。

其主要包含两个接口,用于生成TokenStream(所谓TokenStream,后面我们会讲到,是一个由分词后的Token 结果组成的流,能够不断的得到下一个分成的Token。)。

接口:

1.TokenStream tokenStream(String fieldName, Reader reader)

2.TokenStream reusableTokenStream(String fieldName, Reader reader)

lucene Token流的生成,主要依赖TokenStream 的两个子类Tokenizer和TokenFilter

如上图,当Analyzer从它的tokenStream方法或者reusableTokenStream方法返回tokenStream对象后,它就开始用一个Tokenizer对象创建初始Term序列,然后再链接任意数量的TokenFilter来修改这些Token流

抽象类TokenStream

TokenStream 主要包含以下几个方法:
1. boolean incrementToken()用于得到下一个Token。IndexWriter调用此方法推动Token流到下一个Token。实现类必须实现此方法并更新Attribute信息到下一个Token。
2. public void reset() 重设Token流到开始,使得此TokenStrean 可以重新开始返回各个分词。

TokenStream 是继承于AttributeSource,其包含Map,保存从class 到对象的映射,从而可以保存不同类型的对象的值。在TokenStream 中,经常用到的对象是CharTermAttributeImpl,用来保存Token 字符串;PositionIncrementAttributeImpl 用来保存位置信息;OffsetAttributeImpl 用来保存偏移量信息。所以当生成TokenStream 的时候, 往往调用CharTermAttribute tokenAtt = addAttribute(CharTermAttribute.class)将CharTermAttributeImpl添加到Map 中,并保存一个成员变量

分词器的核心类Analyzer,TokenStream,Tokenizer,TokenFilter.

AnalyzerLucene中的分词器有StandardAnalyzer,StopAnalyzer,SimpleAnalyzer,WhitespaceAnalyzer.

TokenStream分词器做好处理之后得到的一个流,这个流中存储了分词的各种信息.可以通过TokenStream有效的获取到分词单元

Tokenizer主要负责接收字符流Reader,将Reader进行分词操作.有如下一些实现类

KeywordTokenizer,

standardTokenizer,

CharTokenizer

|----WhitespaceTokenizer

|----LetterTokenizer

|----LowerCaseTokenizer

Tokenizer直接继承至TokenStream,其输入input是一个reader
TokenFilter也直接继承TokenStream,但input是一个TokenStream

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值