新手,勿批!
所需架包:IKAnalyzer2012FF_u1.jar,lucene-core-4.0.0.jar,lucene-queries-4.1.0.jar,lucene-queryparser-4.1.0.jar
代码:
package org.apache.lucene.demo;
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.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause;
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.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
@SuppressWarnings("unused")
public class IKAnalyzerDemo {
String fieldName = "title";
String fieldValue="content";
Analyzer analyzer = new IKAnalyzer();
/**
* 创建索引
* @param pathFile 索引存放位置
*/
@SuppressWarnings("deprecation")
public void createIndex(String pathFile){
String text1 = "上海(Shanghai),简称“沪”或“申”,中国第一大城市,中华人民共和国直辖市之一,中国国家中心城市,中国的经济、金融中心,繁荣的国际大都市,是中国首个自贸区“中国(上海)自由贸易试验区”的所在地。";
String text2 = "天津,简称津,中华人民共和国直辖市、中国国家中心城市、中国北方经济中心、环渤海地区经济中心、中国北方国际航运中心、中国北方国际物流中心、国际港口城市和生态城市、国际航运融资中心、中国中医药研发中心、亚太区域海洋仪...";
String text3 = "北京是中华人民共和国的首都、直辖市和国家中心城市之一,中国的政治、文化、科教和国际交往中心,中国经济、金融的决策和管理中心,也是中华人民共和国中央人民政府和全国人民代表大会的办公所在地,位于华北平原的东北边缘,背靠燕山,有永定河流经老城西南,毗邻天津市和河北省";
try {
//文件生成在classpath下
//RAMDirectory directory = new RAMDirectory();
//Directory directory = FSDirectory.getDirectory(path);
//索引存放文件夹 通过测试该文件夹可以持续放入索引 每建索一次 就会生成对应的文件
Directory directory=FSDirectory.open(new File(pathFile));
IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_34, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, writerConfig);
/**
* Field.Store.YES 表示是否存储 Field.Index.ANALYZED 表示对该对象是否建索
* 一般存储需要展示的内容,对有用的如:标题、内容进行建索,链接或者序号不用建索。
*/
Document document1 = new Document();
document1.add(new Field(fieldName, "中国上海", Field.Store.YES, Field.Index.ANALYZED));
document1.add(new Field(fieldValue, text1, Field.Store.YES, Field.Index.ANALYZED));
indexWriter.addDocument(document1);
Document document2 = new Document();
document2.add(new Field(fieldName, "中国天津", Field.Store.YES, Field.Index.ANALYZED));
document2.add(new Field(fieldValue, text2, Field.Store.YES, Field.Index.ANALYZED));
indexWriter.addDocument(document2);
Document document3 = new Document();
document3.add(new Field(fieldName, "北京", Field.Store.YES, Field.Index.ANALYZED));
document3.add(new Field(fieldValue, text3, Field.Store.YES, Field.Index.ANALYZED));
indexWriter.addDocument(document3);
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据关键字检索 多个关键字 检索多个字段
* @param keyName 关键字
* @param pathFile 索引存放路径
*/
@SuppressWarnings("deprecation")
public void IKAnalyzerLuence(String[] keyName,String pathFile){
try {
//搜索
Directory directory=FSDirectory.open(new File(pathFile));
IndexReader indexReader = IndexReader.open(directory);
IndexSearcher searcher = new IndexSearcher(indexReader);
//请求关键字
//String request = "中国经济";
try {
/**
* clauses中的个数和 keyName的个数 以及new String[]{fieldName,fieldValue}中的参数个数相同
*/
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};
Query queryOBJ = MultiFieldQueryParser.parse(Version.LUCENE_40,keyName, new String[]{fieldName,fieldValue}, clauses, analyzer);
//Query query = parser.parse(request);
TopDocs topDocs = searcher.search(queryOBJ, 10);
System.out.println("命中数:"+topDocs.totalHits);
ScoreDoc[] docs = topDocs.scoreDocs;
for(ScoreDoc doc : docs){
Document d = searcher.doc(doc.doc);
System.out.println("标题:"+d.get(fieldName));
System.out.println("内容:"+d.get(fieldValue));
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(indexReader != null){
try{
indexReader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(directory != null){
try{
directory.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据关键字检索 一个关键字 检索多个字段
* @param keyName 关键字
* @param pathFile 索引存放路径
*/
@SuppressWarnings("deprecation")
public void IKAnalyzerLuence2(String keyName,String pathFile){
try {
//搜索
Directory directory=FSDirectory.open(new File(pathFile));
IndexReader indexReader = IndexReader.open(directory);
IndexSearcher searcher = new IndexSearcher(indexReader);
//请求关键字
//String request = "中国经济";
try {
/**
* 如果为SHOULD 检索的内容中关键字可有可无,MUST:必须有,MUST_NOT:必须不含有
*/
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};
Query queryOBJ = MultiFieldQueryParser.parse(Version.LUCENE_40,keyName, new String[]{fieldName,fieldValue}, clauses, analyzer);
//Query query = parser.parse(request);
TopDocs topDocs = searcher.search(queryOBJ, 10);
System.out.println("命中数:"+topDocs.totalHits);
ScoreDoc[] docs = topDocs.scoreDocs;
for(ScoreDoc doc : docs){
Document d = searcher.doc(doc.doc);
System.out.println("标题:"+d.get(fieldName));
System.out.println("内容:"+d.get(fieldValue));
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(indexReader != null){
try{
indexReader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(directory != null){
try{
directory.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String pathFile="D://lucene/index";
/**
* 创建索引
*/
new IKAnalyzerDemo().createIndex(pathFile);
/**
* 1、多个关键字检索多个字段
* String keyName[]={"中国","上海"};
* new IKAnalyzerDemo().IKAnalyzerLuence(keyName, pathFile);
*/
/**
* 2、 一个关键字检索一个或者多个字段
*/
String keyName="中国经济";
new IKAnalyzerDemo().IKAnalyzerLuence2(keyName, pathFile);
}
}
相关推荐
在Luence.net中结合盘古分词,可以实现对中文文本的精确分词,进一步提高搜索的准确性和覆盖率。分词是搜索引擎的关键步骤,它将输入的字符串拆分成一系列有意义的词汇单元,这些单元成为索引和匹配的基础。通过盘古...
“盘古分词”是中国特色的一个分词工具,它针对中文语言的特点进行设计,能够将连续的汉字序列切分成具有语义的词汇。在信息检索、自然语言处理等领域,分词是基础步骤,因为它能让计算机理解并处理中文文本。盘古...
9. **多语言支持**:Luence.Net不仅支持英文,还可以处理其他语言的文本,如中文。Demo中可能会有针对不同语言的索引和查询示例。 通过"Manulife.SearchEngine"这个压缩包中的代码,你可以动手实践以上知识点,理解...
3. 索引(Index):Lucene通过创建倒排索引来实现快速的全文检索。倒排索引将文档中的每个词映射到包含该词的文档集合,大大提高了搜索速度。 二、Lucene工作流程 1. 文档读取:首先,你需要将待搜索的数据(例如...
IKAnalyzer是一个专门针对中文的分词工具,而Lucene则是一个全文检索框架。这里我们深入探讨这两个组件以及它们的关联。 **IKAnalyzer** 是一个高性能的Java实现的中文分词器,特别适合于搜索引擎或者文本分析场景...
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0 则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。 1.2IK...
《Luence和ElasticSearch面试准备》 Lucene和ElasticSearch是两个在全文搜索引擎领域中广泛使用的开源工具。Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格...
2. **分词与索引**:对于中文文档,我们需要进行分词,常用的是结巴分词库,它可以将文本拆分成有意义的词语。然后,将这些词语建立索引,便于后续的检索。 三、Lucene搜索引擎的搭建 1. **Lucene简介**:Apache ...
总之,IK Analyzer 3.0 是一个强大而灵活的中文分词工具,它在处理中文文本方面表现出色,特别适合用于Lucene的全文检索系统。通过其独特的算法和特性,IK Analyzer 3.0 提升了分词速度,增强了查询性能,降低了系统...
而在这个系统中,同时采用了Paoding这个专门针对中文的分词工具,以提升中文搜索的准确性和效率。 首先,我们需要理解Lucene的基本工作原理。Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)...
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。 IK...
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。 IKAnalyzer...
这个过程包括分词(Tokenization)、词干提取(Stemming)、停用词过滤(Stop Word Filtering)等文本处理步骤。`Indexer.java` 文件通常包含了这些步骤的实现,将文档内容转化为 Lucene 可以理解的格式,并保存到...
Lucene是Apache软件基金会的开源全文搜索引擎库,它为开发者提供了在各种应用程序中实现全文检索功能的工具集。Lucene的核心功能包括文本分析、索引创建、查询解析和结果排序。本示例将展示如何在Web环境中使用...
首先,爬虫抓取的网页数据需要经过预处理,例如分词、去除停用词等,然后构建Lucene的Document对象,每个Document对应于一个网页或文档。接着,将这些Documents添加到IndexWriter中,创建索引。索引完成后,用户可以...
Ikanalyzer是专门为中文处理设计的一个分词器,而stopword+dic则涉及到如何定制和使用自定义的停用词表。 首先,我们来谈谈Ikanalyzer。Ikanalyzer是基于IK Analyzer开源项目的一个分词器,专门针对中文进行分词...
Apache Lucene 是一个开源的全文检索库,由Java编写,为开发者提供了强大的文本搜索功能。在深入理解Lucene 4.6的源代码之前,我们首先需要了解全文搜索引擎的基本原理。全文搜索引擎通过索引文档中的关键词来实现...
4. 断词分析:对于中文等非英文语言,需配合合适的分词器,如ikanalyzer,进行断词处理。 5. 排序与过滤:除了默认的按评分排序外,还可以自定义排序策略。Filter类可用于在查询阶段过滤出满足特定条件的文档。 四...
这个过程涉及分析文本(分词)、创建倒排索引等步骤。倒排索引是一种数据结构,它将每个单词映射到包含该词的文档列表,从而加速搜索。 2. **查询处理**: 用户输入查询字符串后,Lucene会解析查询并生成查询树,...
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。 IK...