简要流程图:
1.导入相应的jar包
lucene-analyzers-3.0.1.jar 分割器jar包
lucene-core-3.0.1.jar 核心jar包
lucene-highlighter-3.0.1.jar 高亮显示jar包
lucene-memory-3.0.1.jar 记忆jar包
2.先建一个实体类用来模拟一片文章
import java.io.Serializable;
public class Article implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Long aid;
private String title;
private String content;
public Long getAid() {
return aid;
}
public void setAid(Long aid) {
this.aid = aid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Article [aid=" + aid + ", title=" + title + ", content="
+ content + "]";
}
}
3.模拟 把文章放到索引库(一般索引库提前建好了)
这里是做个例子有兴趣可以研究一下
@Test
public void testCreateIndex() throws Exception{
Article article=new Article();
article.setAid(1L);
article.setTitle("java是世界上最好的语言");
article.setContent("java牛逼!牛逼!牛逼!牛逼!牛逼!");
//创建IndexWriter
/**
* 第一个参数
* 索引库的位置
*/
Directory directory = FSDirectory.open(new File("./Dirindex"));
/*
* 第二个参数
* 分词器
*/
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
/**
* 第三个参数
* 限制索引库中字段的大小
*/
IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
//把article转化成document
Document document = new Document();
/**
* 参数
* name 存储在索引库的名字
* value 存储在索引库中的值
* //Store.YES 保存 可以查询 可以打印内容
* //Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间
* Index.NOT_ANALYZED : 不分词直接索引
* Index.ANALYZED :分词后索引
* Index.NO : 根本不索引,所以不会被检索到
* Index.NOT_ANALYZED_NO_NORMS : 类似Index.NOT_ANALYZED,但不存储NORM TERMS,节约内存但不支持Boost,非常常用
* Index.ANALYZED_NO_NORMS : 类似Index.ANALYZED,但不存储NORM TERMS,节约内存但不支持Boost
*/
Field idField = new Field("aid", article.getAid().toString(), Store.YES, Index.NOT_ANALYZED);
Field titleField = new Field("title", article.getTitle(), Store.YES, Index.NO);
Field contentField = new Field("content", article.getContent(), Store.YES, Index.ANALYZED);
//把上面的field放入到document中
document.add(idField);
document.add(titleField);
document.add(contentField);
indexWriter.addDocument(document);
indexWriter.close();
}
4.从索引库中根据关键字把信息检索出来
这个测试可以成为controller层用来接收请求
返回搜索结构
例:
@Contrnller
public class hello{
@RequestMapping(value = “/queryUserById.do/{userid}”,method = RequestMethod.GET)
@ResponseBody
public String testSearchIndex(@PathVariable(“userid”) int userid) throws Exception{
……搜索的方法体
}
}
“形参”可以是前端请求传过来的“关键字”
使用Test方法测试搜索
@Test
public void testSearchIndex() throws Exception{
/**
* 创建一个IndexSearch对象
*/
Directory directory = FSDirectory.open(new File(“./Dirindex”));//找到索引库的位置
IndexSearcher indexSearcher = new IndexSearcher(directory);//在directory索引库进行搜索
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);//进行分词器的切分 取分词器要和上面放的分词器版本一样(Version.LUCENE_30)
/**
* 第一个参数为版本号
* 第二个参数为在哪个字段中进行检索
*/
QueryParser queryParser = new QueryParser(Version.LUCENE_30,”content”,analyzer);
// QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[]{“title”,”content”},analyzer);
/**
* 关键词
*/
Query query = queryParser.parse(“java”);//前台传过来的关键词 我这里直接写死方便测试
/**
* 第二个参数
* 查找前多少个
* TopDocs–>Top Documents
*/
TopDocs topDocs = indexSearcher.search(query, 1);
int count = topDocs.totalHits;//根据关键词计算出来的总的记录数
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List
for (ScoreDoc scoreDoc : scoreDocs) {
/**
* 关键词的索引
*/
int index = scoreDoc.doc;
/**
* 根据关键词的索引查找到document
*/
Document document = indexSearcher.doc(index);
//把document转化成article
Article article = new Article();
article.setAid(Long.parseLong(document.get(“aid”)));
article.setTitle(document.get(“title”));
article.setContent(document.get(“content”));
articles.add(article);
}
for (Article article : articles) {
System.out.println(article.getAid());//打印id
System.out.println(article.getTitle());//打印标题
System.out.println(article.getContent());//打印内容
}
}
“`
测试结果:
索引库的位置