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;
- 收集待建索引的原文档(Document)
- 将原文档传给词条化工具(Tokenizer)进行文本词条化
- 将第二步得到的词条(Token)传给语言分析工具(Linguistic modules)进行语言学预处理,得到词项(Term)
- 将得到的词项(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