首先引入包
代码:
建立索引
我现在数据库提取一些数据在里面
//创建的文件路径,没有文件夹会给你自动生成一个
private final static String PATH = "E:\\lucene";
//分词器支持中英文记住自己创建时候的版本不然可能查不到数据
private StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
//IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl),第三个参数指定,true表示建立新的索引库或覆盖现有的索引库(删除后重建);false表示使用已有的索引库,如果不存在,就报错。
IndexWriter writer = new IndexWriter(dir,analyzer , true,MaxFieldLength.UNLIMITED);
//循环查询出数据
while(oracleRS.next()){
//创建DOC由于我里面
Document doc1 = new Document();
//Filed这里面有几个参数,第一个设置的字段,第二个是设置该字段的值,第三,第四参见后面
doc1.add(new Field("kid",String.valueOf(oracleRS.getInt("kid")),Field.Store.YES,Index.ANALYZED));
doc1.add(new Field("title",oracleRS.getString("title"),Field.Store.YES,Index.ANALYZED));
doc1.add(new Field("content",oracleRS.getString("content"),Field.Store.YES,Index.ANALYZED));
//写入文件
writer.addDocument(doc1);
}
//合并索引库文件
writer.optimize();
//释放资源
writer.close();
枚举类型 枚举常量 说明
Store NO 不存储属性的值
YES 存储属性的值
Index NO 不建立索引
ANALYZED 分词后建立索引
NOT_ANALYZED 不分词,把整个内容作为一个词建立索引
索引建立好后会在我的D盘上生成一个叫lucene文件夹里面就是我们生成好的索引
查询
public String getIndex(String query)
{
String path = "D:\\lucene" ;
try {
FSDirectory dir = SimpleFSDirectory.open(new File(path));
//读取文件
IndexReader reader = IndexReader.open(dir);
//实例查询对象
IndexSearcher searcher = new IndexSearcher(reader);
//这个是查询哪个字段里面的值 可以是多个或是一个,
String[] fileds = {"title","content"};
//设置分词器版本,查询哪个字段里面的值
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, fileds, new StandardAnalyzer(Version.LUCENE_30));
//生成一个Query对象
Query querys = parser.parse(query);
Directory directory = FSDirectory.open(new File(path));
//这里为什么又要生成一个呢,因为我要查一个我查一共多少条数据后面主要分页查询
IndexSearcher indexSearcher = new IndexSearcher(directory);
TopDocs topDocs = indexSearcher.search(querys, 100);
//总条数
int count = topDocs.totalHits;
//共查询多少条数据我是10条
TopScoreDocCollector results = TopScoreDocCollector.create(10, false);
searcher.search(querys, results);
//分页从0条到10条
TopDocs tds = results.topDocs(0, 10);
ScoreDoc[] sd = tds.scoreDocs;
//这个是将查询出来的关键词前后加字符,我的页面的EM标签设置的字体颜色是红色所以在关键词到了页面就变成了红色
Formatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
Scorer scorer = new QueryScorer(querys);
Highlighter highlighter = new Highlighter(formatter, scorer);
//查询多少字
highlighter.setTextFragmenter(new SimpleFragmenter(10000));
//里面就是查询出来的值,循环遍历里面的值
for (int i = 0; i < sd.length; i++) {
ScoreDoc scoreDoc = sd[i];
int docID = scoreDoc.doc;
Document document = indexSearcher.doc(docID);
String txt=highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_30), "title", document.get("title"));
String txt2=highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_30), "content", document.get("content"));
String txt3=document.get("url");
//获取该字段的值
System.out.println("kid:"+document.get("kid"));
System.out.println("title:"+txt);
System.out.println("content:"+document.get("content"));
System.out.println("url:"+txt3);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
后面的就比较简单了
然后是添加索引
/**
* 大致后上面一样IndexWriter writer = new IndexWriter(dir,analyzer , false,MaxFieldLength.UNLIMITED);
* 把它调成false就好了
* */
public void ss() throws Exception{
Directory dir = new SimpleFSDirectory(new File(PATH));
IndexWriter writer = new IndexWriter(dir,analyzer , false,MaxFieldLength.UNLIMITED);
Document doc1 = new Document();
doc1.add(new Field("kid","4444",Field.Store.YES,Index.ANALYZED));
doc1.add(new Field("title","阿森松岛",Field.Store.YES,Index.ANALYZED));
doc1.add(new Field("content","枫的手",Field.Store.YES,Index.ANALYZED));
doc1.add(new Field("url","阿萨德份额",Field.Store.YES,Index.ANALYZED));
writer.addDocument(doc1);
writer.optimize();
writer.close();
}
删除
public void deleteLucene(String id){
FSDirectory path;
try {
path = SimpleFSDirectory.open(new File("D:\\lucene"));
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter writer = new IndexWriter(path,analyzer,false,MaxFieldLength.UNLIMITED);
writer.setUseCompoundFile(true);
//注意这里最好是填写唯一的不然到时会满足该情况时,数据都删了
writer.deleteDocuments(new Term("kid",id));
writer.optimize();
writer.commit();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
修改
public void updateLucene(String key,String up){
System.out.println("修改");
FSDirectory path;
try {
path = SimpleFSDirectory.open(new File("D:\\lucene"));
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
IndexWriter writer = new IndexWriter(path,analyzer,false,MaxFieldLength.UNLIMITED);
writer.setUseCompoundFile(true);
Document document = new Document();
/**
* 这里特别要说下一定要每个值都设置不然没设置的那个字段会是NULL
* */
document.add(new Field("kid", key, Field.Store.YES,Index.ANALYZED));
document.add(new Field("title", "sssss", Field.Store.YES,Index.ANALYZED));
document.add(new Field("content", "sssss", Field.Store.YES,Index.ANALYZED));
document.add(new Field("url", up, Field.Store.YES,Index.ANALYZED));
//UPDATE方法
writer.updateDocument(new Term("kid", key), document);
//提交
writer.commit();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
分享到:
相关推荐
在这个“Lucene3.0增删改查和关键字高亮实例”项目中,我们将深入理解如何利用Lucene 3.0版本进行索引构建、文档的增删改查操作,并学习关键字高亮显示的实现方法。 首先,我们要了解**创建索引**的基本流程。在...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...
【Lucene3.0查询类型详解】 在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较...
lucene 3.0 API中文帮助,学习的人懂得的
《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...
《深入理解Lucene与IKAnalyzer:构建全文搜索引擎》 在信息技术高速发展的今天,数据的存储与检索变得至关重要。Lucene,作为一个开源的全文检索库,为开发者提供了强大的文本搜索功能。而IKAnalyzer作为针对中文...
《Lucene 3.0 原理与代码分析完整版》是一本深入解析Lucene 3.0搜索引擎库的专业书籍。Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这...
同时,Lucene 3.0 支持对已有索引的增删改操作,但需要注意的是,这可能会增加索引的复杂性和大小。 7. **内存与缓存**:为了提升性能,Lucene 会在内存中缓存某些数据,如Term Frequency信息。在 3.0 版本中,合理...
lucene3.0 例子lucene3.0 例子 lucene3.0 例子 ,很好的学习,只有原代原,jar 包自己加上去就OK了
lucene3.0 中文分词器, 庖丁解牛
**Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4 Jakarta项目组开发的开源全文检索引擎工具包。自1999年发布以来,Lucene 已经发展成为Java世界中最为广泛使用的全文检索库,为开发者提供了构建高...