/**
* IK Analyzer Demo
* @param args
*/
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
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.RAMDirectory;
import org.wltea.analyzer.IKSegmentation;
import org.wltea.analyzer.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
import cn.jh.db.jdbc.DBO;
import cn.jh.db.jdbc.DBOManager;
/**
* @author linly
*
*/
public class IKAnalyzerDemo {
static final File INDEX_DIR = new File("index");
static void test() throws Exception{
String fieldName = "text";
//检索内容
IndexWriter iwriter = null;
RAMDirectory ramDir = new RAMDirectory();
IKAnalyzer ika=new IKAnalyzer();
DBO newsdbo = DBOManager.createDBO("CMS34");
{
iwriter=new IndexWriter(ramDir, ika, true , IndexWriter.MaxFieldLength.LIMITED);
IndexWriter fileWriter = new IndexWriter(FSDirectory.open(INDEX_DIR),ika, true, IndexWriter.MaxFieldLength.LIMITED);
fileWriter.addIndexesNoOptimize(new Directory[]{ramDir});
Document doc = new Document();
doc.add(new Field(fieldName, "1234", Field.Store.YES, Field.Index.ANALYZED));
iwriter.addDocument(doc);
iwriter.commit();
iwriter.close();
fileWriter.commit();
fileWriter.close();
}
for(int i=0;i<1;i++){
iwriter = new IndexWriter(ramDir, ika, false , IndexWriter.MaxFieldLength.LIMITED);
int m=1000*i;
System.out.println("select Title from News_tab order by newsId desc limit "+m+", 1000 ");
List<String> titles = newsdbo.getObjList("select Title from News_tab limit "+m+", 5000 ", String.class);
for(String t:titles){
Document doc = new Document();
doc.add(new Field(fieldName, t, Field.Store.YES, Field.Index.ANALYZED));
iwriter.addDocument(doc);
}
iwriter.close();
IndexWriter fileWriter = new IndexWriter(FSDirectory.open(INDEX_DIR),ika, false, IndexWriter.MaxFieldLength.LIMITED);
fileWriter.addIndexesNoOptimize(new Directory[]{ramDir});
// = new IndexWriter(ramDir, ika, true );
fileWriter.commit();
fileWriter.close();
}
}
static void test2() throws Exception{
IKAnalyzer ika=new IKAnalyzer();
RAMDirectory directory = null;
IndexSearcher isearcher = null;
//建立内存索引对象
IndexWriter iwriter = null;
//实例化搜索器
//
// directory = new RAMDirectory();
// iwriter = new IndexWriter(directory, ika, true , IndexWriter.MaxFieldLength.LIMITED);
// iwriter.addIndexesNoOptimize(new Directory[]{FSDirectory.open(INDEX_DIR)});
// iwriter.close();
isearcher = new IndexSearcher(FSDirectory.open(INDEX_DIR));
//在索引器中使用IKSimilarity相似度评估器
isearcher.setSimilarity(new IKSimilarity());
String keyword = "铲除网上黄毒需法律亮剑";
IKSegmentation ikSeg = new IKSegmentation(new StringReader(keyword),
true);
keyword="";
try {
Lexeme l = null;
while ((l = ikSeg.next()) != null) {
if (l.getLexemeType() == 0){
System.out.println(l.getLexemeText());
keyword+=l.getLexemeText()+" ";
}
}
} catch (IOException e) {
e.printStackTrace();
}
String fieldName = "text";
//使用IKQueryParser查询分析器构造Query对象
Query query = IKQueryParser.parse(fieldName, keyword);
//搜索相似度最高的5条记录
int max=20;
TopDocs topDocs = isearcher.search(query , max);
System.out.println("命中:" + topDocs.totalHits);
//输出结果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < topDocs.totalHits&&i<max; i++){
Document targetDoc = isearcher.doc(scoreDocs[i].doc);
System.out.println("内容:" + targetDoc.toString()+"\t\t"+targetDoc);
}
}
public static void main(String[] args) throws Exception{
test();
test2();
// test2();
// test();
// test2();
// test();
// test2();
// test();
// test2();
}
}
分享到:
相关推荐
public class IKAnalyzerDemo { public static void main(String[] args) throws IOException { // 创建Analyzer实例 Analyzer analyzer = new IKAnalyzer(true); // 准备待分词文本 String text = "IK-...
在这个"solr_5.0_tomcat7_IKAnalyzer中文分词安装及demo"的压缩包中,你将找到如何在Solr 5.0中集成IKAnalyzer并进行演示的详细步骤。 首先,我们需要了解Solr与IKAnalyzer的集成过程: 1. **下载和解压**:获取...
IKAnalyzer 是一个开源的、基于Java语言开发的中文分词器,主要应用于全文检索和自然语言处理领域。这款工具在中文信息处理方面表现出了高效、灵活的特点,深受开发者喜爱。标题提到的 "IKAnalyzer3.2.8.jar" 是IK...
分词器的配置是灵活的,可以根据需求选择不同的分词策略,比如标准分词器(StandardAnalyzer)适用于大多数英文文本,而中文分词可能需要使用IKAnalyzer或SmartChineseAnalyzer等针对中文特性的分词器。 在运行这个...
- 使用合适的分析器:根据应用需求选择合适的分析器,例如英文的StandardAnalyzer或中文的IKAnalyzer。 - 调优索引性能:合理设置索引参数,如缓冲区大小、合并策略等,以平衡速度与磁盘空间。 - 多线程处理:...
不同的语言可能需要不同的分词器,例如英文的 StandardAnalyzer 和中文的 IKAnalyzer。 4. **术语(Term)**:分词后的结果称为术语,它是 Lucene 搜索的基本单元。 5. **倒排索引(Inverted Index)**:这是 ...
例如,可以使用IK Analyzer、SmartCN Analyzer或jieba分词库来实现。此外,你还会学习到如何设计查询解析器,将用户的输入转换为Lucene可以理解的查询语法。 "搜索结果的处理和显示"这部分则涉及到如何获取查询结果...
在中文分词方面,Solr-Solrj配合Solr的中文分析器(如IK Analyzer、Smart Chinese Analyzer或HanLP等)能有效地处理中文文本。这些分析器会将输入的中文字符串拆分成有意义的词语,便于索引和搜索。配置分析器通常在...
总的来说,这个Demo涵盖了Solr 7.4与MySQL的集成、数据导入和IK分词器的使用,帮助你搭建一个能够处理中文数据的全文搜索引擎。通过实践,你可以更好地理解Solr的数据处理流程以及如何优化中文搜索体验。
开发者可以根据需求选择不同的分析器,例如标准分析器(StandardAnalyzer)用于处理英文文本,而中文则需要使用如 IK 分析器(IKAnalyzer)。 2. **Document**: 文档对象代表要索引的信息,可以包含多个字段(Field...
1. 初始化 Analyzer(例如使用 IKAnalyzer),并创建 Directory 对象(如 RAMDirectory 或 FSDirectory)来存储索引。 2. 使用 IndexWriter 实例化并配置参数,开始写入索引。 3. 创建 Document 对象,添加 Field,...
7. **分词技术**:如使用开源的HanLP、IK Analyzer等进行中文分词,以便于处理中文搜索。 8. **缓存机制**:可能包含对搜索结果的缓存,以减少重复计算和提升响应速度。 9. **并发处理**:学习如何处理大量并发的...