引入jar包::
lucene-analyzers-3.6.1.jar
lucene-core-3.6.1.jar
lucene-highlighter-3.6.1.jar (高亮效果)
首先,将需要检索的数据用内定的方式创建索引,(这里创建索引保存在硬盘)
1、新建一个config.properties
#路径
indexPath=C:/lucene-doc
2、建一个Configuration类:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Configuration {
//采用单例模式
private static final Configuration configuration = new Configuration();
private Configuration(){}
public synchronized static Configuration getInstance(){
return configuration;
}
public String read(String properties,String key){
//读取配置文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream(properties);
Properties p = new Properties();
try {
p.load(in);
} catch (IOException e) {
e.printStackTrace();
}
//取得配置文件中的值
return p.getProperty(key);
}
}
3、创建索引:
/**
* 创建索引
*/
public String createSearch() throws Exception {
System.out.println("开始创建索引。。。");
long stime = new Date().getTime();
String indexPath = Configuration.getInstance().read("config.properties", "indexPath");
Directory dir = FSDirectory.open(new File(indexPath));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);
iwc.setOpenMode(OpenMode.CREATE); //即创建新索引文件OpenMode.CREATE_OR_APPEND表示创建或追加到已有索引文件
IndexWriter writer = new IndexWriter(dir, iwc);
//需要建立 索引的数据
List<User> users = userService.getAll(); //从数据库获取数据
for(User u : users){
Document doc = new Document();
// int 要转换 String
doc.add(new Field("id",String.valueOf(u.getId()), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("username",u.getUsername(), Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
}
writer.close();
long endTime = new Date().getTime();
System.out.println("这花费了 " + (endTime - stime)+ "毫秒来把数据增加到索引"+indexPath+"里面去!");
return SUCCESS;
}
结果如下:
开始创建索引。。。
这花费了 1285毫秒来把数据增加到索引C:/lucene-doc里面去!
4、根据关键字,检索:
/**
* 从Lucene索引库中——搜索
*/
public String searchKeyword() throws Exception {
System.out.println("开始检索。。。");
long startTime = new Date().getTime();
String indexPath = Configuration.getInstance().read("config.properties", "indexPath");
users = new ArrayList<User>();
IndexReader reader = IndexReader.open(FSDirectory.open(new File(indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
String field = "username";//设置一个默认的field,因为在用户没有指定field时,lucene会在默认的field中检索
QueryParser parser = new QueryParser(Version.LUCENE_36, field, analyzer);
Query query = parser.parse(keyword); //搜索关键词
searcher.search(query, null, 100);
TopDocs results = searcher.search(query, 10); //只取排名前10的搜索结果
ScoreDoc[] hits = results.scoreDocs;
Document doc = null;
for(ScoreDoc scorceDoc : hits){
doc = searcher.doc(scorceDoc.doc);
User u = new User();
u.setId(Integer.parseInt(doc.get("id")));
// u.setUsername(doc.get("username")); //不高亮
u.setUsername(this.getHighLight(doc, analyzer, query, "username"));//使用高亮
users.add(u);
}
searcher.close();
reader.close();
long endTime = new Date().getTime();
System.out.println("检索花费了 " + (endTime - startTime)+ "毫秒来把数据从"+indexPath+"里面检索出来!");
for(User u : users){
System.out.println("以下是检索结果:"+u.getUsername()+"---"+u.getId());
}
return SUCCESS;
}
5、高亮方法
public String getHighLight(Document doc,Analyzer analyzer,Query query,String field)throws Exception{
//设置高亮显示格式
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'><strong>", "</strong></font>");
/* 语法高亮显示设置 */
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));
// 取 field 字段值,准备进行高亮
String fieldValue = doc.get(field);
TokenStream tokenStream = analyzer.tokenStream(field,new StringReader(fieldValue));
//转成高亮的值
String highLightFieldValue = highlighter.getBestFragment(tokenStream, fieldValue);
if(highLightFieldValue == null)
highLightFieldValue = fieldValue;
return highLightFieldValue;
}
PS:还有几个全局变量:
private String keyword;
private List<User> users;
以上代码是在ssh框架中实现的,代码不好打包上传。
分享到:
相关推荐
基于Lucene3.6进行全文检索的开发
lucene3.6 搜索例子
NULL 博文链接:https://yuan-bin1990.iteye.com/blog/1700272
本案例通过.Net MVC4基础上,针对Lucene.Net实现全文检索的应用。通过查询数据表中数据,创建索引,通过统一输入框进行全文检索。可以进行对索引的增删改查功能。
这个是使用lucene实现全文检索的jar包 包含IkAnalyer jar这个分词器 使用非常方便
第一章 LUCENE基础 2 1.1 索引部分的核心类 2 1.2 分词部分的核心类 2 1.3 搜索部分的核心类 2 第二章 索引建立 3 2.1 创建Directory 3 2.2 创建Writer 3 2.3 创建文档并且添加索引 4 2.4 查询索引的基本信息 5 2.5 ...
lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全
lucene 3.6 的入门例子 代码简洁 注释清晰 是入门只必备啊 附带了ik中文分词器 支持 停用词 扩展词等
在网上找了实例,但是发现不能使用,只能简历索引。...lucene3.6版本,能够建立索引,能搜索。inderwriter,indexsearch. 其中包C下的helloword实例能用,其余的全是网上不能用的。直接下载 可以运行
lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,lucene,全文检索,lucene例子
Lucene实现全文检索
说明: 例子是根据lucene3.6写的,也可以说是直接copy别人的。 包括参考文章的代码,以及修改部分之后的代码
超全的lucene3.6学习记录,实现了3中不同方法的检索,而且都很简单,容易上手,附带工程原文件
lucene3.6的src包,可以用于附加上去看相应的源代码
本文档详细介绍了lucene3.6中的索引,以及每个部分对应于硬盘下的文件夹里的哪个文件。这个根据本人多年学术及编程经验总结的
修复IKAnalyzer2012存在的无法添加扩展的中文停用词的bug。详见:http://blog.csdn.net/kmguo/article/details/8779522
lucene3.6入门实例教程 完整代码示例,lucene入门学习很好的资料
基本可以满足 检索电脑内文件的需求了 已经封装过了 直接指定检索目录和索引目录来创建索引.提供给学习者门参考... 直接通过调用静态方法来实现 深度分页检索.
本文主要是研究了全文检索技术的基本原理以及Lucene的架构和工作原理,并介绍了基于Lucene的实时全文检索引擎的设计实现过程。并提供了一个基于Web的简单实现。最后通过实验的方式,对实现的实时全文检索引擎的性能...
这是lucene的使用案例,实现了对word文档中的关键字检索,并将检索出的内容高亮打印出来