import java.io.StringReader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateField;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryFilter;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
public class LuceneSearch {
public static void main(String[] args) throws Exception{
LuceneSearch test = new LuceneSearch();
//
Hits h = null;
h = test.search("显示 ");
test.printResult(h);
h = test.search("jy");
test.printResult(h);
h = test.search("djy");
test.printResult(h);
h = test.search("料不");
test.printResult(h);
h = test.search("人");
test.printResult(h);
}
public LuceneSearch(){
try{
searcher = new IndexSearcher(IndexReader.open("E:\\lucene\\test4\\index"));
}catch(Exception e){
e.printStackTrace();
}
}
//声明一个IndexSearcher对象
private IndexSearcher searcher = null;
//声明一个Query对象
private Query query = null;
ChineseAnalyzer analyzer = new ChineseAnalyzer();
Highlighter highlighter = null;
public final Hits search(String keyword){
System.out.println("正在检索关键字:"+keyword);
try{
Date start = new Date();
/***** 一个关键字,对一个字段进行查询 *****/
QueryParser qp = new QueryParser("content",analyzer);
query = qp.parse(keyword);
// Hits hits = searcher.search(query);
/***** 模糊查询 *****/
// Term term = new Term("content",keyword);
// FuzzyQuery fq = new FuzzyQuery(term);
// Hits hits = searcher.search(fq);
/***** 一个关键字,在两个字段中查询 *****/
/*
* 1.BooleanClause.Occur[]的三种类型:
* MUST : + and
* MUST_NOT : - not
* SHOULD : or
* 2.下面查询的意思是:content中必须包含该关键字,而title有没有都无所谓
* 3.下面的这个查询中,Occur[]的长度必须和Fields[]的长度一致。每个限制条件对应一个字段
*/
// BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};
// query=MultiFieldQueryParser.parse(keyword,new String[]{"title","content"},flags,analyzer);
/***** 两个(多个)关键字对两个(多个)字段进行查询,默认匹配规则 *****/
/*
* 1.关键字的个数必须和字段的个数相等
* 2.由于没有指定匹配规定,默认为"SHOULD"
* 因此,下面查询的意思是:"title"中含有keyword1 或 "content"含有keyword2.
* 在此例中,把keyword1和keyword2相同
*/
// query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new String[]{"title","content"},analyzer);
/***** 两个(多个)关键字对两个(多个)字段进行查询,手工指定匹配规则 *****/
/*
* 1.必须 关键字的个数 == 字段名的个数 == 匹配规则的个数
* 2.下面查询的意思是:"title"必须不含有keyword1,并且"content"中必须含有keyword2
*/
// BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.MUST};
// query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new String[]{"title","content"},flags,analyzer);
/***** 对日期型字段进行查询 *****/
/***** 对数字范围进行查询 *****/
/*
* 1.两个条件必须是同一个字段
* 2.前面一个条件必须比后面一个条件小,否则找不到数据
* 3.new RangeQuery中的第三个参数,表示是否包含"="
* true: >= 或 <=
* false: > 或 <
* 4.找出 55>=id>=53 or 60>=id>=57:
*/
// Term lowerTerm1 = new Term("id","53");
// Term upperTerm1 = new Term("id","55");
// RangeQuery rq1 = new RangeQuery(lowerTerm1,upperTerm1,true);
//
// Term lowerTerm2 = new Term("id","57");
// Term upperTerm2 = new Term("id","60");
// RangeQuery rq2 = new RangeQuery(lowerTerm2,upperTerm2,true);
//
// BooleanQuery bq = new BooleanQuery();
// bq.add(rq1,BooleanClause.Occur.SHOULD);
// bq.add(rq2,BooleanClause.Occur.SHOULD);
// Hits hits = searcher.search(bq);
/***** 排序 *****/
/*
* 1.被排序的字段必须被索引过(Indexecd),在索引时不能 用 Field.Index.TOKENIZED
* (用UN_TOKENIZED可以正常实现.用NO时查询正常,但排序不能正常设置升降序)
* 2.SortField类型
* SCORE、DOC、AUTO、STRING、INT、FLOAT、CUSTOM
* 此类型主要是根据字段的类型选择
* 3.SortField的第三个参数代表是否是降序
* true:降序 false:升序
*/
// Sort sort = new Sort(new SortField[]{new SortField("id", SortField.INT, true)});
// Hits hits = searcher.search(query,sort);
/*
* 按日期排序
*/
// Sort sort = new Sort(new SortField[]{new SortField("createTime", SortField.INT, false)});
/***** 过滤器 ******/
// QueryParser qp1 = new QueryParser("content",analyzer);
// Query fquery = qp1.parse("我");
//
// BooleanQuery bqf = new BooleanQuery();
// bqf.add(fquery,BooleanClause.Occur.SHOULD);
//
// QueryFilter qf = new QueryFilter(bqf);
Hits hits = searcher.search(query);
Date end = new Date();
System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒");
return hits;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public void printResult(Hits h){
if(h.length() == 0){
System.out.println("对不起,没有找到您要的结果.");
}else{
for(int i = 0; i < h.length(); i++){
try{
Document doc = h.doc(i);
System.out.println("结果"+(i+1)+":"+doc.get("id")+" createTime:"+doc.get("createTime")+" title:"+doc.get("title")+" content:"+doc.get("content"));
//System.out.println(doc.get("path"));
}catch(Exception e){
e.printStackTrace();
}
}
}
System.out.println("--------------------------------------");
}
}
分享到:
相关推荐
**基于LUCENE的搜索引擎项目详解** Apache Lucene是一个高性能、全文本搜索库,它为开发者提供了构建全文搜索引擎所需要的基础工具。在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及...
**Lucene 知识点详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够轻易地在应用中集成全文检索功能。本实例将通过一个具体的应用场景,...
**Lucene学习例子与文档详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了完整的搜索功能,包括索引、查询、排序等。Lucene被广泛应用于各种需要全文检索的项目中,如网站、文档管理、...
**Lucene 知识点详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够快速地在大量数据中实现全文检索功能。Lucene 的核心功能包括文本...
此外,通过使用不同的分析器,Lucene还支持多种语言的搜索,具备强大的模糊匹配和近似搜索能力。 ### 五、学习资源与实践 学习Lucene 3.4,你可以参考官方文档、在线教程和开源项目。了解其核心组件如`Analyzer`、...
**Lucene实例项目及其打包文件详解** Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。这个实例项目是基于Lucene官网提供的,旨在帮助开发者更好地理解和使用Lucene进行...
**Lucene.NET中文帮助文档详解** Lucene.NET是一款开源全文搜索引擎库,它是Apache Lucene项目在.NET框架下的实现。这个库提供了高级的信息检索服务,包括文本分析、索引和搜索功能,广泛应用于各种需要高效搜索...
### Lucene基础知识与实战应用详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Java编写而成。它为开发者提供了一套完整的工具来实现搜索功能,无需了解复杂的检索算法即可轻松搭建自己的...
在这个例子中,Servlet可能负责接收用户的搜索请求,使用Lucene进行查询,并返回结果。 4. **索引构建**:在Web应用中,通常会在后台定期或者在需要时构建或更新Lucene索引。这包括读取数据源(如数据库、文件系统...
【Lucene.Net 知识点详解】 Lucene.Net 是一个基于 .NET Framework 的全文检索库,它是 Apache Lucene 的 .NET 移植版。Lucene 是由 Java 编写的,而 Lucene.Net 则将其核心功能带入了 .NET 平台,允许 .NET 开发者...
**Lucene工程实例详解** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会维护。它提供了文本分析、索引和搜索的基本功能,是Java开发者在构建高性能搜索功能时的首选工具。本文将深入探讨Lucene的基本概念、...
- 支持多种索引创建方式和灵活的搜索策略。 - 具备高性能的分布式搜索能力。 - **应用场景**: - 企业级搜索引擎构建。 - 数据库索引优化。 - 高效完成站内搜索功能。 #### 二、Solr 与 Lucene 区别 - **...
《Solr与Ansj分词器的深度整合:AnsjTokenizerFactory详解》 在现代信息检索系统中,分词是至关重要的一步,它直接影响到搜索结果的准确性和效率。Solr,作为Apache Lucene的一个高性能、全文搜索引擎服务器,广泛...
《SpringData Elasticsearch全文搜索与IK分词器详解》 在当今大数据时代,高效的数据检索成为企业信息化建设的关键一环。Elasticsearch作为一款强大的开源搜索引擎,因其高效、灵活的特性,被广泛应用于日志分析、...
《SpringData Elasticsearch全文搜索与IK分词器详解》 在现代大数据时代,全文搜索引擎成为处理海量信息的关键工具,其中Elasticsearch作为一款流行的开源搜索引擎,因其高效、灵活和可扩展性,被广泛应用。本文将...
Elasticsearch是一款强大的开源搜索引擎,它基于Lucene构建,提供了分布式、全文搜索、分析和存储功能。在现代大数据环境中,Elasticsearch因其高效、可扩展性和易用性而备受青睐。RESTful API是Elasticsearch与外界...
1. **基于Lucene自封装实现站内搜索**:这种方式需要较大的开发投入,并且在后续维护和扩展上也会比较复杂,因此在本教材中并未推荐此方法。 2. **调用第三方搜索引擎API**(如Google或Baidu API):虽然这种方式...
Elasticsearch是一个开源的全文搜索引擎,基于Apache Lucene构建,用Java编写。它简化了全文检索的过程,提供了一套RESTful API,使得操作变得直观简单。Elasticsearch不仅是一个搜索引擎,它也是一个分布式、实时的...
在这个例子中,Solr 使用的是 Lucene 4.10.1 版本。保持 Lucene 版本与 Solr 版本的兼容性对于确保索引操作正确无误至关重要。 **lib 节点** - **定义**:`*\.jar"/>` 这个节点表示 Solr 引用包的位置。当指定的...