Lucene快速开发
1.环境配置
导入jar包
lucene-4.10.4
1.analysis
2.core
3.highlighter
4.queryparser
2.创建索引
2.1创建文档对象
//创建文档对象
Document doc = new Document();
//添加模拟数据
//添加id
doc.add(new StringField("id", "11", Store.NO));
//添加title
doc.add(new TextField("title", "三分钟学会lucene",Store.YES));
//添加context
doc.add(new TextField("content", "倒排索引(也称为倒排文件)是一种存储了来自文本"
+ "中的映射的索引数据结构。比如单词或者数字,对应到它们在数据库、一个文件或"
+ "者一组文件中的位置。它是在文档检索系统中使用的最流行的数据结构,在搜索引擎"
+ "中有大规模使用案例例如我们使用新华字典查询汉字,新华字典有偏旁部首的目录(索引),"
+ "我们查字首先查这个目录,找到这个目录中对应的偏旁部首,就可以通过这个目录中的"
+ "偏旁部首找到这个字所在的位置(文档)。",Store.NO));
真实开发中来自文档,数据库,网页
场景1:搜索word文档
读取文档,将数据变成文档对象,解析成单词,存储索引库,搜索索引库数据,搜索到文档
场景2:查询数据库
把数据变成文档对象,解析成单词,放入索引库
场景3:爬虫爬取网页
解析网页,把网页数据变成文档对象,索引放入库
2.2创建建立索引的对象
//Lucene管理索引存储空间
FSDirectory directory = FSDirectory.open(new File("E:\\Java\\TEMP"));
//创建分词器
Analyzer analyzer = new IKAnalyzer();
//创建索引库,引入核心配置文件
IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
//创建索引库,引入核心文件
IndexWriter indexWriter = new IndexWriter(directory, writerConfig);
创建索引库写入对象核心配置对象
参数1:指定使用lucene版本
参数2:指定创建索引库使用分词器
2.3写入索引库,提交,并关闭资源
//写入索引库
indexWriter.addDocument(doc);
//提交
indexWriter.commit();
//关闭资源
indexWriter.close();
3.查询索引库
3.1创建查询索引库核心对象
//指定索引库存储位置
File file = new File("E:\\Java\\TEMP");
//读取索引库索引
DirectoryReader directoryReader = DirectoryReader.open(FSDirectory.open(file));
//创建查询索引库核心对象
IndexSearcher searcher = new IndexSearcher(directoryReader);
3.2创建查询解析器,解析查询关键词
//指定关键词
String key = new String("三分钟");
//创建查询解析器,解析查询关键字
QueryParser queryParser = new QueryParser("title",new IKAnalyzer());
//对关键词分词
Query parse = queryParser.parse(key);
QueryParser
参数1:指定查询字段
参数2:使用索引创建时的分词器
3.3使用indexSearcher查询
//查询
TopDocs topDocs = searcher.search(parse, 10);
//获得文档总记录数
int totalHits = topDocs.totalHits;
System.out.println("文档总记录数:"+totalHits);
// 获得文档id,得分数组
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
返回文档概要信息
TopDocs:文档总记录数,文档id,文档得分
返回得分最高的10条记录
匹配度越高,得分越高
获取查询文档总记录数
获取文档id,文档得分数组
3.4循环数组获得单个文档id,获得文档对象
//遍历数组
for (ScoreDoc scoreDoc : scoreDocs) {
//获得文档id
int docId = scoreDoc.doc;
System.out.println("文档ID:"+docId);
//获得文档得分
float score = scoreDoc.score;
System.out.println("文档得分:"+score);
//根据id查询文档对象
Document doc = searcher.doc(docId);
//获得文档对象id
String id = doc.get("id");
System.out.println("文档域id:"+id);
//获得文档对象title
String title = doc.get("title");
System.out.println("文档域title:"+title);
//获得文档对象content
String content = doc.get("content");
System.out.println("文档域content:"+content);
}