/**
* lucene-core-3.3.0
* lucene-highlighter-3.3.0
*/
public class LuceneIndex {
//分词器
private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_33);
//索引文件存放位置
private final String indexPath = "/home/zhanghc/luence/index/";
/**
* 创建索引
*/
public boolean createIndex() throws IOException {
Directory directory = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = new IndexWriter(directory, config);
String [] array_content = {"在泽州县彤康食品有限公司", "屠宰加工项目建成投产", "比如肉制品均来自双汇", "雨润等大型肉类生产商"};
String [] array_name = {"泽州", "屠宰", "肉制品", "肉类生产商"};
for (int i = 0; i < 4; i++) {
Document document = new Document();
document.add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.YES));
document.add(new Field("name", array_name[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
document.add(new Field("content", array_content[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
writer.addDocument(document);
}
writer.optimize();
writer.close();
return true;
}
/**
* 删除索引
* @throws ParseException
*/
public void deletes() throws IOException, ParseException{
Directory directory = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = new IndexWriter(directory, config);
Term term = new Term("id", "0");
writer.deleteDocuments(term);
// Query query = new QueryParser(Version.LUCENE_33, "id", new StandardAnalyzer(Version.LUCENE_33)).parse("2");
// writer.deleteDocuments(query);
writer.optimize();
System.out.println(writer.numDocs());
writer.close();
}
/**
* 更新索引
* @throws IOException
*/
public void updates() throws IOException{
Directory directory = FSDirectory.open(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_33, analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = new IndexWriter(directory, config);
String [] array_content = {"索引的删除,纠结了很久,看到一篇总结不错的文章,转载过来好好学习", "即使在不关闭IndexReader的情况下"};
String [] array_name = {"索引", "关闭"};
for (int i = 0; i < 2; i++) {
Document document = new Document();
Term term = new Term("id", String.valueOf(i));
document.add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.YES));
document.add(new Field("name", array_name[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
document.add(new Field("content", array_content[i], Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
writer.updateDocument(term, document);
//Updates a document by first deleting the document(s) containing term and then adding the new document. The delete and then add are atomic as seen by a reader on the same index (flush may happen only after the add).
}
System.out.println(writer.numDocs());
writer.optimize();
writer.close();
}
/**
* 单条件查询
*/
public void search(String val) throws CorruptIndexException, IOException, ParseException{
IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
final String field = "name";
QueryParser queryParser = new QueryParser(Version.LUCENE_33, field, analyzer);
Query query = queryParser.parse(val);
//设置高亮显示
//设置高亮显示格式
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
//语法高亮显示设置
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));//100似乎是表示最终输出字的个数
TopDocs result = search.search(query, 10);// 10是显示队列的Size
System.out.println("搜索结果,搜索条数为:" + result.totalHits);
for (ScoreDoc item : result.scoreDocs) {
Document document = search.doc(item.doc);
String out = document.get(field);
//搜索结果
TokenStream tream = analyzer.tokenStream(field, new StringReader(out));
try {
System.out.println(highlighter.getBestFragment(tream, out));
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
search.close();
}
/**
* 多条件查询
* @throws IOException
* @throws CorruptIndexException
* @throws ParseException
*/
public void mutilSearch(String val) throws CorruptIndexException, IOException, ParseException{
IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
BooleanClause.Occur [] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
//BooleanClause.Occur [] 表示多个条件之间的关系,
//BooleanClause.Occur.MUST表示必须含有
//BooleanClause.Occur.MUST_NOT表示不含有
//BooleanClause.Occur.SHOULDb表示含不含有均可
final String [] fields = {"name", "content"};
//根据 name content两个属性查询
Query query = MultiFieldQueryParser.parse(Version.LUCENE_33, val, fields, clauses, analyzer);
//设置高亮显示
//设置高亮显示格式
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
//语法高亮显示设置
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));//100是高亮范围
TopDocs result = search.search(query, 10);// 10是显示队列的Size
System.out.println("搜索结果,搜索条数为:" + result.totalHits);
for (ScoreDoc item : result.scoreDocs) {
Document document = search.doc(item.doc);
String out_name = document.get("name");
String out_content = document.get("content");
//搜索结果
TokenStream tream_name = analyzer.tokenStream("name", new StringReader(out_name));
TokenStream tream_content = analyzer.tokenStream("content", new StringReader(out_content));
try {
String name = highlighter.getBestFragment(tream_name, out_name);
String content = highlighter.getBestFragment(tream_content, out_content);
if(name == null)
name = out_name;
if(content == null)
content = out_content;
System.out.println(name);
System.out.println(content);
System.out.println("---------------");
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
search.close();
}
/**
* 多条件查询
* @throws IOException
* @throws CorruptIndexException
* @throws ParseException
*/
public void mutilSearch_2(String val) throws CorruptIndexException, IOException, ParseException{
IndexSearcher search = new IndexSearcher(FSDirectory.open(new File(indexPath)), true);
BooleanQuery booleanQuery = new BooleanQuery();
final String field = "name";
QueryParser queryParser = new QueryParser(Version.LUCENE_33, field, analyzer);
Query query = queryParser.parse(val);
booleanQuery.add(query, Occur.MUST_NOT);
final String field_2 = "content";
QueryParser queryParser_2 = new QueryParser(Version.LUCENE_33, field_2, analyzer);
Query query_2 = queryParser_2.parse(val);
booleanQuery.add(query_2, Occur.MUST);
//设置高亮显示
//设置高亮显示格式
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font><strong>", "</strong></font>");
//语法高亮显示设置
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));//100似乎是表示最终输出字的个数
TopDocs result = search.search(booleanQuery, 10);// 10是显示队列的Size
System.out.println("搜索结果,搜索条数为:" + result.totalHits);
for (ScoreDoc item : result.scoreDocs) {
Document document = search.doc(item.doc);
String out_name = document.get("name");
String out_content = document.get("content");
//搜索结果
TokenStream tream_name = analyzer.tokenStream("name", new StringReader(out_name));
TokenStream tream_content = analyzer.tokenStream("content", new StringReader(out_content));
try {
String name = highlighter.getBestFragment(tream_name, out_name);
String content = highlighter.getBestFragment(tream_content, out_content);
if(name == null)
name = out_name;
if(content == null)
content = out_content;
System.out.println(name);
System.out.println(content);
System.out.println("---------------");
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
search.close();
}
}
分享到:
相关推荐
"luence客户端测试软件luke" 指的是一个名为"Luke"的工具,它是针对Apache Lucene(一个流行的全文搜索引擎库)的客户端测试和分析工具。Luence可能是“Lucene”的拼写错误,但在这里我们假设指的是Lucene。 **描述...
《Luence.net搜索小程序深度解析》 在信息技术日益发达的今天,搜索引擎已成为数据挖掘与信息检索的重要工具。本文将深入探讨一款基于.NET平台的搜索引擎——Luence.net,它以其高效、灵活的特点,为开发者提供了...
《Luence搜索Demo详解》 在信息技术领域,搜索引擎已经成为数据检索不可或缺的一部分,而Luence作为一款高性能、可扩展的全文搜索引擎库,深受开发者喜爱。本文将深入探讨基于.NET平台的Luence.Net搜索Demo,帮助...
lucene 原理与分析,底层源码解析,应用场景及实践,相关配置
《Luence和ElasticSearch面试准备》 Lucene和ElasticSearch是两个在全文搜索引擎领域中广泛使用的开源工具。Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格...
IKAnalyzer和Lucene是两个在中文处理领域广泛应用的开源项目。IKAnalyzer是一个专门针对中文的分词工具,而Lucene则是一个全文检索框架。这里我们深入探讨这两个组件以及它们的关联。 **IKAnalyzer** 是一个高性能...
### 获取全部Luence数据 #### 知识点详解 **Lucene** 是一个高性能、全功能的文本搜索引擎库。在本文档中,我们将探讨如何通过Lucene获取索引中的所有文档,包括创建索引、查询索引以及遍历所有文档的具体步骤。 ...
5. **luence46**: 这个压缩包可能包含了Lucene 4.6版本的源代码,源码提供了深入了解其内部工作原理的机会。你可以通过阅读和分析源代码,学习如何实现自己的搜索功能,或者优化现有系统的搜索性能。 通过对...
在IT行业中,前后端分离是一种常见的软件开发模式,它将应用程序分为两个主要部分:前端(用户界面)和后端(服务器逻辑)。这种架构允许前端和后端开发人员独立工作,提高了开发效率,并提供了更好的可维护性和扩展...
《Lucene in Action》是一本深入探讨Apache Lucene的权威指南,这本书的中英文PDF版本提供了全面了解和学习这个搜索引擎库的机会。Lucene是Java开发的一款高性能、全文本搜索库,广泛应用于各种需要强大搜索功能的...
《深入理解Lucene搜索引擎》 Lucene,作为一个开源的全文搜索引擎库,被广泛应用于各种信息检索系统中。它提供了一套高效、灵活的文本搜索解决方案,使得开发者能够快速地在大量数据中实现高效的全文检索功能。...
在"Luence简单实例"中,我们可能会看到以下步骤的Java代码实现: 1. **创建索引**: 首先,需要创建一个`IndexWriter`对象,设置好索引目录和分析器。接着,通过`Document`对象添加字段,如`add(new Field("content...
标题 "luence索引例子" 暗示我们要探讨的是Lucene,一个广泛使用的全文搜索引擎库,它在处理大量文本数据时提供了高效的检索能力。在这个例子中,我们将深入理解如何利用Lucene创建索引来优化数据库记录的搜索性能。...
总之,“Luence的与盘古分词的使用软件”是将Lucene.NET和盘古分词相结合,利用C# .NET技术在VS2013环境下构建的一款文本处理应用。它实现了对用户输入句子的分词,以及基于分词结果的索引查询,从而在大量文本数据...
在搜索引擎和信息检索领域,Lucene是一个非常重要的开源全文搜索引擎库。它提供了高效的文本索引和搜索功能,被广泛应用于各种信息系统的后台。在Lucene中,为了提高搜索的准确性和效率,通常会使用到一些优化技术,...
前后端分离项目使用的spring Mvc、 mybatis、 luence、 spring 开发的开源知识库系统的所有后端端源码。 下载可运行。 使用前后端分离架构, 使用springMvc 、 spring、 mybatis、 luence等技术开发的开源知识库所有...
《构建垂直搜索引擎:VerticalSearcher与Lucene的实践》 在信息技术日新月异的今天,搜索引擎已经成为我们获取信息的重要工具。垂直搜索引擎是相对于通用搜索引擎而言的,它专注于某一特定领域,如科技、医疗或教育...
**Lucene 索引图形化界面工具 LukeAll 3.5~4.0** Lucene 是一个开源的全文搜索引擎库,它提供了强大的文本搜索功能,但其本身的接口设计是命令行或者编程式的,对于非开发人员或者在调试索引时可能会显得不太友好。...
正在上传: 上传速度: 已用时: 预计剩余时间: 上传文件大小: 已上传大小: 0% 用过的tag 企业crm(1) 项目代码(1) java(1) luncene(1) 方法有图(1)