一、定义:Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。即:Lucene是根据关健字来搜索的文本搜索工具,只能在某个网站内部搜索文本内容,不能跨网站搜索。
二、使用Lucene原因:
(1)SQL只能针对数据库的表搜索,不能直接对硬盘上的文本搜索
(2)SQL没有相关度排名
(3)SQL搜索结果没有关健字高亮显示
(4)SQL需要数据库的支持,数据库本身需要内存开销较大,例如:Oracle
(5)SQL搜索有时较慢,尤其是数据库不在本地时,超慢,例如:Oracle
三、使用步骤:
1.创建javaWeb工程
2.导入Lucene相关的jar包:
lucene-core-3.0.2.jar【Lucene核心】
lucene-analyzers-3.0.2.jar【分词器】
lucene-highlighter-3.0.2.jar【Lucene会将搜索出来的字,高亮显示,提示用户】
lucene-memory-3.0.2.jar【索引库优化策略】
3.编写代码
- 定义一个Javabean类
2.测试类
/**
* 使用IndexWrite向索引库中写入数据
* Ctrl+T显示某个类的继承结构
* @throws IOException
*/
@Test
public void CreateIndex() throws IOException{
//索引存放的位置,设置在当前目录中
Directory directory = FSDirectory.open(Paths.get("indexDir/"));
//添加Lucene的版本
Version version = Version.LUCENE_6_6_0;
//创建lucene的分词器,主要用于进行分词,比如识别你好,中国,甚至一些以前没有,但现在出先的词
Analyzer analyzer = new StandardAnalyzer();
//创建索引写入配置
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
//创建索引写入对象
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
//创建Document对象,存储索引
Document doc = new Document();
//创建字段用于存储数据
/**
* @param:name:字段名
* @param:value:字段值
* @param:store:是否存储
*/
int iD = 6;
Field id = new IntPoint("id",iD);
Field storeField = new StoredField("id", iD);
Field title = new StringField("title","ImportNew - 专注Java & Android 技术分享",Store.YES);
Field content = new TextField("content","ImportNew 是一个专注于 Java & Android 技术分享的博客,为Java 和 Android开发者提供有价值的内容。包括:Android开发与快讯、Java Web开发和其他的Java技术相关的",Store.YES);
//将字段加入到doc中
doc.add(id);
doc.add(title);
doc.add(content);
doc.add(storeField);
//将doc对象保存到索引库中
indexWriter.addDocument(doc);
//关闭流
indexWriter.close();
}
/**
* @throws IOException
*
*/
@Test
public void SelectIndex() throws IOException{
//索引存放的位置
Directory directory = FSDirectory.open(Paths.get("indexDir/"));
//创建索引的读取器
IndexReader indexReader = DirectoryReader.open(directory);
//创建一个索引的查找器,来检索索引库
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//这是一个条件查询的api,用于添加条件
Term term = new Term("title","ImportNew - 专注Java & Android 技术分享");
TermQuery termQuery = new TermQuery(term);
//搜索先搜索索引库
//返回符合条件的前100条记录
TopDocs topDocs = indexSearcher.search(termQuery, 100);
//打印查询到的记录数
System.out.println("总记录数:"+topDocs.totalHits);
//得到得分文档数组
ScoreDoc scoreDocs[] = topDocs.scoreDocs;
//遍历数组,返回一个击中
for(ScoreDoc scoreDoc : scoreDocs){
int docID = scoreDoc.doc;
//取得对应的文档对象
Document document = indexSearcher.doc(docID);
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
}
注:不同lucene的版本对应的jdk版本是不一样的,不对应会出错。