概述
创建索引的话,我就直接使用了死的数据。你们维护索引什么的我给一个思路,大家自己看着来吧,如果你会创建以及搜索的话。我相信你们肯定可以连接数据库对数据库进行索引以及查询。
废话不说了。
如何创建索引
首先创建一个实体类吧!
package com.gss.article.entity.vo;
/**
* 永无八阿哥
*
* @Author:gssznb
* @Date:Created 2018/12/79:43
* @Description: 这是一个描述,但是我可能不会写
* @Modified By:
*/
public class JcShopArticleEntityVo {
private Integer docId;
private String articleId;
private String title;
private String date;
public JcShopArticleEntityVo() {
}
public JcShopArticleEntityVo(Integer docId, String articleId, String title, String date) {
this.docId = docId;
this.articleId = articleId;
this.title = title;
this.date = date;
}
// 。。。 省略get/set方法了
}
创建索引类
public class LuceneUtil{
private static final Logger log = LoggerFactory.getLogger(LucenneUtil.class);
// 这个是lucene索引保存的路径,可以自己创建个路径 添加进来。
private static final String INDEX_PATH = "C:\\Users\\gssznb\\Desktop\\lucene1";
// 私有化构造方法,无法创建对象
private LucenneUtil() {
}
/**
* @param analyzer 分词器,根据需要创建的分词器
* @return
* @Descirption 创建写入索引的对象
* 我这边传入的是Analyzer这个接口,也就是说你只要是分词器都会实现这个接口。
*/
public static IndexWriter getIndexWriter(Analyzer analyzer) {
// 得到索引所在目录的的路径
try {
FSDirectory directory = FSDirectory.open(Paths.get(INDEX_PATH));
// 保存用于创建IndexWriter的所有配置
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
// 实例化IndexWriter
return new IndexWriter(directory, indexWriterConfig);
} catch (IOException e) {
e.printStackTrace(System.out);
log.info(e.getMessage());
return null;
}
}
/**
* @param writer 创建的写索引对象
* @throws IOException 关闭索引时抛出的异常
* @Description 关闭写索引
*/
public static void close(IndexWriter writer) throws IOException {
writer.close();
}
/**
* @param model 传入的模型类,来制作文档索引。
* @return 返回一个文档。
* @Description 用来创建文档。
*/
public static void writeDocument(JcShopArticleEntityVo model, IndexWriter writer) {
// 创建一个需要写入的文档
Document doc = new Document();
// 将字段和值以及是否储存添加到文档中。
// TextField是对字符串的进行分词。
// StringFiled 是不会对这个进行分词。
doc.add(new LongField("articleId",model.getArticleId(), org.apache.lucene.document.Field.Store.NO));
doc.add(new TextField("articleTitle",model.getTitle(), org.apache.lucene.document.Field.Store.YES));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format((Date) model.getPublishTime());
doc.add(new StringField("articleDate",date, org.apache.lucene.document.Field.Store.YES));
try {
writer.addDocument(doc);
} catch (IOException e) {
e.printStackTrace(System.out);
log.info("写入失败!");
}
try {
LucenneUtil.close(writer);
} catch (IOException e) {
e.printStackTrace();
}
}
// 创建索引 不为空 则创建成功!
public static IndexSearcher getSearch() {
FSDirectory directory = null;
try {
directory = FSDirectory.open(Paths.get(INDEX_PATH));
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(reader);
return indexSearcher;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// 直接使用main方法来创建
public static void main(String[] args){
// 首先创建模拟分词的数据
JcShopArticleEntityVo vo = new JcShopArticleEntityVo(118L,666L,"一群傻狗","2018-08-26");
// ... 创建多少个 可以自行看着办 我这边就不多写了。
// 创建分词器
SmartChineseAnalyzer analyzer = new SmartChaineseAnalyzer();
// 创建索引, 将分词器传入获取索引的方法。
IndexWriter indexWriter = LuceneUtils.getIndexWriter(analyzer);
// 写入数据直接调用方法
LuceneUtils.writeDocument(vo,indexWriter);
// 这样就算创建好索引库了。
}
// 搜索
public static void main(String[] args){
// 获取搜索索引的对象
IndexSearcher indexSearch = LuceneUtil.getSearch();
// 创建分词器
SmartChineseAnalyzer analyzer = new SmartChaineseAnalyzer();
//
}
}