// if(hasNew)
// {
// writer.deleteAll();
// }
//纠结一个问题,为啥这行不注释就不能正常运行呢
package Java.se.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
//import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
public class Searcher {
//创建IK分词器
Analyzer analyzer =new IKAnalyzer();
private static Directory directory=null;
private static String text = "IK Analyzer是一个结合词典分词和文法分词的中文分词开源工具包。" +
"它使用了全新的正向迭代最细粒度切分算法。";
private static IndexReader reader=null;
public Searcher()
{
try {
directory= FSDirectory.open(new File("f:/lucene/Index06/"));
} catch (IOException e) {
e.printStackTrace();
}
// directory= new RAMDirectory();
}
public void index(boolean hasNew)
{
IndexWriter writer=null;
try {
writer=new IndexWriter(directory,new IndexWriterConfig(Version
.LUCENE_36,analyzer));
// if(hasNew)
// {
// writer.deleteAll();
// }
Document doc=null;
doc=new Document();
doc.add(new Field("content", text, Field.Store.YES,Field.Index.ANALYZED) );
writer.addDocument(doc);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally
{
if(writer!=null)
{
try {
writer.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void search(String query)
{
try {
reader=IndexReader.open(directory);
IndexSearcher searcher=new IndexSearcher(reader);
//在索引中使用IkSimilarity似度评估器
searcher.setSimilarity(new IKSimilarity());
//使用IKQueryParse查询分析器创建Query对象,搜索域为content
Query q=IKQueryParser.parse("content",query);
//搜索相关度最高的五条记录
TopDocs tds=searcher.search(q,10);
ScoreDoc[] sd=tds.scoreDocs;
System.out.println(tds.totalHits);
for(int i=0;i<tds.totalHits;i++){
System.out.println("sduyfusfuah");
Document document=searcher.doc(sd[i].doc);
System.out.println(document.toString());
}
searcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void check() throws IOException{ //检查索引是否被正确建立(打印索引)
//Directory directory = FSDirectory.open(new File("f:/lucene/Index06/"));//创建directory,其储存方式为在
IndexReader reader = IndexReader.open(directory);
System.out.println(reader.numDocs());
for(int i = 0;i<reader.numDocs();i++){
System.out.println(reader.document(i));
}
reader.close();
}
public static void main(String[] args) throws IOException {
new Searcher().check();
}
}
package Java.se.lucene;
import org.junit.Before;
import org.junit.Test;
public class Test_Analyzer{
private static Searcher ps=null;
@Before
public void init()
{
ps=new Searcher();
}
@Test
public void test_index()
{
ps.index(true);
}
@Test
public void test_search01()
{
ps.search("中文");
System.out.println("---------------------------");
}
}
Lucene小练十三(IK分词器)
最新推荐文章于 2021-08-10 12:12:02 发布