上一篇:Lucene的原理与基本使用
第一个lucene程序
package com.baizhi.util;
import com.baizhi.entity.NewMessage;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
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.QueryParser;
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.search.highlight.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 第一个lucene程序
*/
public class TestLucene {
// 创建索引库
public static void createIndexDB() throws Exception {
// 1. 指定索引库位置
Directory directory = FSDirectory.open(new File("F://indexDB"));
// 2. 把数据放入索引库中
NewMessage newMessage = new NewMessage("1","1803班节假日消息","梦龙","1803班节假日不参与吧,谢谢合作!",new Date());
// 3. 将数据写入索引库
// lucene的 版本号 使用当前jar的最高版本
Version version= Version.LUCENE_44;
// 分词器:做文本分词
Analyzer analyzer= new StandardAnalyzer(version);
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(version,analyzer);
IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
// doc lucene索引库只支持doc对象 将自定义对象 转换为 doc对象
Document document = new Document();
Field field;
/**
* intField : 处理整数类型数据
* DoubleField : 处理浮点数类型数据 双精度
* floatField : 处理浮点数类型数据 单精度
* LongField : 处理日期类型数据
* StringField : 处理字符串类型数据 不支持分词
* TextField : 处理字符串类型数据 支持分词
*
*/
/**
* name: 当前doc的属性名
* value:当前doc的属性值
* store: YES/NO 是否添加至索引库
*/
document.add(new StringField("id",newMessage.getId(), Field.Store.YES));
document.add(new StringField("title",newMessage.getTitle(), Field.Store.YES));
document.add(new TextField("author",newMessage.getAuthor(), Field.Store.YES));
document.add(new TextField("content",newMessage.getContent(), Field.Store.YES));
document.add(new LongField("createDate",newMessage.getCreateDate().getTime(), Field.Store.YES));
// 将数据添加至索引库
indexWriter.addDocument(document);
// 提交
indexWriter.commit();
// 关流
indexWriter.close();;
}
/**
* 索引库的检索
*/
public static List<NewMessage> search(String keysword) throws Exception {
// 1. 指定索引库位置
Directory directory = FSDirectory.open(new File("F://indexDB"));
// 2. 根据关键字查询 查询器
IndexReader open = IndexReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(open);
// 3. 封装关键字
/**
* 参数说明:
* version: lucene的版本号
* Field : 查询的列/属性 例如: select * from cmfz_book where book_name=#{name}
* analyzer: 分词器不同 分词结果不同 一定要与创建时,使用相同的分词器
*/
// 多列查询
//QueryParser queryParser = new QueryParser(Version.LUCENE_44,"content",new StandardAnalyzer(Version.LUCENE_44));
String[] fields = {"author","content"};
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44,fields,new StandardAnalyzer(Version.LUCENE_44));
//参数说明: Query 关键字对象
// int 最终返回的数据条数
Query query = queryParser.parse(keysword);
// 创建高亮容器
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter,scorer);
// 4. 根据关键字使用 查询器进行查询
TopDocs topDocs = indexSearcher.search(query, 10);
/**
* TopDocs :
* 1. ScoreDocs 数据索引标号数组
* 2. totalHits 关键字命中的总条数
*
*/
// 索引表号数组
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 当前关键字命中的总条数
int totalHits = topDocs.totalHits;
System.out.println("关键字命中的总条数:"+totalHits);
// 5. 遍历索引标号数组,根据索引表号获取原数据
List list = new ArrayList();
for (ScoreDoc s:scoreDocs) {
// 索引标号
int doc = s.doc;
System.out.println("当前doc的索引标号:"+doc);
// 通过查询器 indexSearcher
Document document = indexSearcher.doc(doc);
// 将doc对象转换为 自定义对象
String id = document.get("id");
String title = document.get("title");
String createDate = document.get("createDate");
/**
* analyzer: 分词器 一定要保证前后一致
* fieldName: 属性名
* text: 属性值
*
* 梦
* 梦龙 索引库查询
* <font color='red'>梦</font>龙 容器
*/
String newAuthor = highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_44), "author", document.get("author"));
String newContent = highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_44),"content",document.get("content"));
if(newAuthor==null){
newAuthor = document.get("author");
}
if(newContent==null){
newContent = document.get("content");
}
// 2018-09-15 毫秒数
Long aLong = Long.valueOf(createDate);
Date d = new Date(aLong);
NewMessage newMessage = new NewMessage(id,title,newAuthor,newContent,d);
System.out.println(newMessage);
list.add(newMessage);
}
return list;
}
/* public static void main(String[] args) throws Exception {
search("梦龙");
//createIndexDB();
}*/
}
上一篇:Lucene的原理与基本使用